https://vjudge.net/problem/UVA-11038
题意:
输入两个非负整数m和n,求将m~n的所有整数写出来,一共要写多少个数字0?
思路:
举个例子来说:
12345
从右到左分析各位为0的情况:
最先分析各位5,在它左边是1234,所以当各位为0时,左边可以是0~1234的任何一个数,此时有1234种情况
接下来十位4,在它左边是123,右边可以是0~9的任何一个数,此时为123×10种情况
可以发现每一位的情况数为left×10^i(i为右边的数字个数)
注意:如果该位的数字时0的话,左边的数得减1,但是也别忘了加上右边的数。
比如说:12304 就是122×10+5
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 using namespace std; 11 12 long long n,m; 13 14 long long solve(long long n) 15 { 16 if(n<0) return 0; 17 long long ans=1,right=0,x=1; 18 while(n>=10) 19 { 20 long long now=n%10; 21 n/=10; 22 if(now) ans+=n*x; 23 else ans+=(n-1)*x+right+1; 24 right=now*x+right; 25 x*=10; 26 } 27 return ans; 28 } 29 30 int main() 31 { 32 //freopen("D:\input.txt","r",stdin); 33 while(~scanf("%lld%lld",&n,&m)) 34 { 35 if(n==-1 && m==-1) break; 36 printf("%lld ",solve(m)-solve(n-1)); 37 } 38 return 0; 39 }