Uva 11038 - How Many O's?
2013-04-03 23:08
405 查看
/* 输入a,b 求a,b之间数字中0的个数 f(b) 代表1到b(包括b)0的数目 f(b)-f(a-1)就是所求的答案 现在的问题就是怎样求f(x) f(4294967295)= 429496729+429496720 + 429496700+429496000 + 429490000 + 429400000 + 429000000 + 420000000 + 400000000 f(50000)= 5000+(5000-10+1) + (5000-100+1) +(5000-1000+1) //5000 +4991 +4901 +4001 找规律:对于其中的某位 if(当n是10的整数倍时),sum+=(n/10+pow(10,(n的从右向左的第几位-1))+1) else sum+=这个数右边的位变成 0 如第一个例子所示 这道题 和求1的数目都有相似之处 (下面的来自编程之美) LONGLONG Sum1s(ULONGLONG n) { ULONGLONG iCount=0; ULONGLONG iFactor=1; ULONGLONG iLowerNum=0; ULONGLONG iCurrNum=0; ULONGLONG iHigherNum=0; while(n/iFactor!=0) { iLowerNum=n-(n/iFactor)*iFactor; iCurrNum=(n/iFactor)%10; iHigherNum=n/(iFactor*10); switch(iCurrNum) { case 0: iCount+=iHigherNum*iFactor; break; case 1: iCount+=iHigherNum*iFactor+iLowerNum+1; break; default: iCount+=(iHigherNum+1)*iFactor; break; } iFactor*=10; } return iCount; } */ #include<stdio.h> long long sum0(long long n) { long long sum=0; long long k=0; long long kk=1; while(n>=10) { long long x=n%10; n=n/10; if(x==0) { sum+=(n-1)*kk+(k+1); printf("%lld +",(n-1)*kk+(k+1)); } else { sum+=n*kk; printf("%lld +",n*kk); } k+=x*kk; kk=10*kk; } return sum; } int main() { long long n,m; while(scanf("%lld%lld",&n,&m)!=EOF) { if(n<0)break; long long x=sum0(m); long long y=sum0(n-1); if(n==0)y--; printf("%lld\n",x-y); } return 0; }
相关文章推荐
- uva 11038 How Many O's? 组合计数
- uva 11038 - How Many O's?
- uva11038 How Many O's? 数位dp
- UVA - 11038 How Many O's? (计数)
- UVA 11038 How Many O's?——整数区间分解
- UVA11038- How Many O's?(组合数学)
- uva 11038 - How Many O's?(计数问题)
- UVA 11038 - How Many O's?(计数问题)
- Uva 11038 - How Many O's? 解题报告(计数)
- UVa:11038 How Many O's?
- UVa11038 - How Many O's?(数位dp)
- UVA 11038 How Many O's? (数位统计 )
- UVA 11038 - How Many O's? (数学题)
- UVA11038 How Many O's?题解
- UVA11038- How Many O's?(组合数学)
- UVa 11038 - How Many O's? (组合数学 数位统计)
- UVa-11038 How Many O's? (整数区间分解)
- UVa 10223 - How many nodes ?
- UVA-10213 How many pieces of land
- UVa 10790 - How Many Points of Intersection?