想法:
將問題簡化為求1~m 0的總數,以及1~n 0的總數,然後最後再相減。
求1~n 0的總數,要將n分別算每個位數0的個數,舉例如30324:
1 #include <cstdio> 2 using namespace std; 3 typedef long long int llt; 4 5 llt sum0(llt n) 6 { 7 llt N = n, sum = 0; 8 int left = 1, mid, right = 1; 9 while(N >= 10) 10 { 11 mid = N % 10; 12 N /= 10; 13 if(mid) sum += (N * left); 14 else sum += ((N-1) * left + n % right + 1); 15 left *= 10; 16 right *= 10; 17 } 18 return sum; 19 } 20 21 int main() 22 { 23 llt m, n; 24 while(scanf("%lld%lld", &m, &n) == 2 && m >= 0) 25 { 26 llt ans = sum0(n) - sum0(m-1); 27 if(m == 0) ans ++; // 函数是从1~m, 如果m==0会少算 28 printf("%lld\n", ans); 29 } 30 return 0; 31 }
原文:http://www.cnblogs.com/aze-003/p/5153679.html