作业帮 > 综合 > 作业

一道ACM题TimeLimit:1 Second MemoryLimit:32 Megabyte Totalsubmit

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 05:56:00
一道ACM题
TimeLimit:1 Second MemoryLimit:32 Megabyte
Totalsubmit:966 Accepted:85
Description
给你两个数a和b,你的任务是计算出1在a和b之间出现的次数,比如说,如果a=1024,b=1032,那么a和b之间的数就是:
1024 1025 1026 1027 1028 1029 1030 1031 1032
则有10个1出现在这些数中.
Input
输入不会超过500行.每一行有两个数a和b,a和b的范围是0 < a,b < 100000000.输入两个0时程序结束,两个0不作为输入样例.
Output
对于每一对输入的a和b,输出一个数,代表1出现的个数.
Sample Input
1 10
44 497
346 542
1199 1748
1496 1403
1004 503
1714 190
1317 854
1976 494
1001 1960
0 0
Sample Output
2
185
40
666
113
105
1133
512
1375
1256
程序:
#include
#include
using namespace std;
int sum=0,i,j=0,k,l,o,v,q;
int pow(int e,int r)
{
int val=1;
while(r>0)
{
val=val*e;
r--;
}
return val;
}
int num(int n)
{ k=n;
j=0;
if(k==0)
return 0;
while(k!=0)
{
i=k%10;
k=k/10;
j++;
}
if(i==1)
{
if(j==1)
{
return sum++;
}
else
{
l=j;
sum=sum+n-pow(10,l-1)+1;
sum=(l-2)*pow(10,l-2)+pow(10,l-2)+sum;
num(n-pow(10,l-1));
return sum;
}
}
else
{
if(j==1)
return sum=sum+1;
else
{
o=i;
l=j;
sum=o*(l-1)*pow(10,l-2)+pow(10,l-1)+sum;
num(n-o*pow(10,j-1));
return sum;
}
}
j=0;
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b) &&((a==0&&b!=0)||(a!=0&&b==0)||(a!=0&&b!=0)))
{
if(a
你的程序不能正确a与b相等的情况,如:
1 1
2 2
3 3
以下多输出了一个空格:
printf("%d \n",v-q);
改为
printf("%d\n",v-q);
再问: 你的程序不能正确a与b相等的情况,如: 1 1 2 2 3 3 能不能讲一讲 我现在把if(i==1) { if(j==1) { return sum++; } 改为++sum;
再答: 我的意思是你的程序不能正确处理以下输入: 1 1 2 2 3 3 我没有看懂你的函数num,好象太复杂了.以下是我写的,但不知是否能AC,供你参考. #include using namespace std; int num(int n) { char str[10]; int i, l; itoa(n, str, 10);//转换为字符串 for (i = l = 0; str[i]!=0; i++)//数字符串中出现‘1’的个数 if (str[i] == '1') l++; return l; } int main() { int a,b; int t, sum; while(scanf("%d %d",&a,&b) &&(a||b)) { if(a>b) { t=a; a=b; b=t; } sum = 0; for (t=a; t