[复合] 计数数字0,1,2,3的数量,…,9 在从1 GT的范围内; N | MDIGITS
主题: HTTP://vn.spoj.com/problems/MDIGITS/
给定两个整数的, B. 写之间的所有数字, B; 含 2 这个数字.
制定出每个数字 0, 1, .., 9 每个数字出现的次数.
例, 如果= 1024 且b = 1032, 范围将是
1024 1025 1026 1027 1028 1029 1030 1031 1032
和 10 号码 0, 10 号码 1, 7 号码 2, …
我数着从0〜位数>该, 0->B,则轮流每个位数 (0->9) 乙减去.
联赛历史上一些 31627 (相比于数 0), 我把下面的数字分别为:
考虑在第一列中的数目, 数量 0,1,2 10 ^ 4号, 号码 3 将有 1627+1 = 1628 号码 (上述冻结的图像中 0 未出, 我们向下折叠到最后数 00000)
从柱中发现 2 开始 (人物) 它可分为群集 (3 簇) 其中每个集群包括巧克力0〜>9 4 * 10 ^ 3数量.
所以,现在我们只考虑同一些 1627 只 !
一旦计数完成,注意力减去数 0 无效 (001) 然后 2 号码 0 无效的顶部.
#include <stdio.h> #include <math.h> int A[] = {1,10,100,1000,10000,100000,1000000,10000000,100000000}; void pro(int num, int len, int count[]) { int n, i; n = num / A[len]; if (num ==0) { count[n] += len+1; return; } for(i=0;i<n;i++) count[i] += A[len]; count[n] += num % A[len] + 1; if(len==0) return; for(i=0;i<10;i++) count[i] += n*len*A[len-1]; pro(num % A[len], len-1, count); } int main() { int p1, p2, a, b, c, i; while(scanf("%d%d",&a,&b)==2 && a+b) { if(a>b) { c = a; a = b; b = c; } a--; int count1[10] = {1}; int count2[10] = {1}; if(a) { p1 = (int)floor(log10(a)); pro(a, p1, count1); for(i=0; i<=p1; i++); count1[0] -= A[i]; } p2 = (int)floor(log10(b)); pro(b, p2, count2); for(i=0; i<=p2; i++) count2[0] -= A[i]; printf("%d",count2[0]-count1[0]); for(i=1; i<10; i++) printf(" %d",count2[i]-count1[i]); printf("n"); } return 0; }
最新评论