您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: