暑期 每日一练acm题 都来看看说的好给分 只限C

qq14344545 2012-07-22 12:55:58
给定两个数a和b,计算出1在a和b之间出现的次数。例如
如果 a = 1024 ,b = 1032
那么 a和b之间的数就是:
1024 1025 1026 1027 1028 1029 1030 1031 1032
则有10个1出现在这些数中。

输入:
输入不超过500行。每行有两个数a和b,a和b的范围是0<a,b<100000000(一亿)。
输入两个0时程序结束,两个零不作为输入样例。

输入:
对于对于每一对输入的a和b,输出一个数,代表1出现的个数。

样例输入:

1 10
44 497
346 542
1199 1748
1496 1403
0 0

样例输出:

2
185
40
666
113



楼主编写:

#include<stdio.h>

int main()
{
long int a,b,c,i = 0,j,n = 1,m,mun[500];
while( 1 )
{
scanf("%d%d",&a,&b);
if( a == 0 && b == 0 )
break;
if( a > b )
{
c = a;
a = b;
b = c;
}
j = 0;
for( ; a <= b; a++ )
{
m = a;
while( m != 0 )
{
n = m % 10;
if( n == 1 )
j++;
m = m / 10;
}
}
mun[i] = j;
i++;
}
for( j = 0; j < i ; j++ )
printf("%d\n",mun[j]);
return 0;
}


看了有什么指点尽管说 我都虚心接纳 分不多 一番心意吧 顺便求老师
...全文
217 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_april_s 2012-07-23
  • 打赏
  • 举报
回复
我觉得还可以先看位数从高位从要比较的最高位看如44~497高位为百则百位为1的话只有100~199所以判断求出,而再看十位,再看个位,我觉得应该可以实现吧,但也不知道快不快。。。。
Caworb 2012-07-22
  • 打赏
  • 举报
回复
分治思想…将a-b先化为1-a跟1-b的问题!然后相剪…
从高位开始判断…位权降低时…次数*10…相加即可…可应用递归…
ww884203 2012-07-22
  • 打赏
  • 举报
回复
补充一下,算出来x位数的1的数量为nx,(从上面的规律可以看出nx = x * 10^(x-1) )
然后给一个数ABCD,就可以求出ABCD的1的个数为

伪代码:

sum=0;
if(A>1) sum += A*n3 + 1000
else if(A==1)sum += A*n3 + BCD
if(B>1) sum += B*n2 + 100
else if(B==1)sum += B*n2 + CD
if(C>1) sum += C*n1 + 10
else if(C==1)sum == C*n1 + D
if(D>=1) sum+=1

以上是伪代码,只是为了描述一下中间计算的过程。实际编写代码的时候中间用一个循环写就行了。
pathuang68 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
0~9里面有一个1
10~19里面,如果不考虑十位,也只有一个1
20~29里面只有一个1
30~39里面只有一个1
4
5
6
7
8
9.....
所以,0~99中间有19个1,也就是说每100个数,只需要判断一次

这个题目,用递归应该比较合适。以上是大致思路,仅供楼主参考。
1100~1200 和 0 到 100 明显是不同的
[/Quote]

假定是1100 ~ 1199(像1200之类的边边角角可另外处理),抛去千位和百位不考虑的话你觉得1100~1199和0~99有何不同:)
ww884203 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
0~9里面有一个1
10~19里面,如果不考虑十位,也只有一个1
20~29里面只有一个1
30~39里面只有一个1
4
5
6
7
8
9.....
所以,0~99中间有19个1,也就是说每100个数,只需要判断一次

这个题目,用递归应该比较合适。以上是大致思路,仅供楼主参考。
1100~1200 和 0 到 100 明显是不同的
[/Quote]

别人只是提供给你一个思路而已,你首先应该做的是顺着他的思路想想,而不是马上反驳别人
可以分解一下,比如说
0~9 里面有1个1,记为n1 = 1 ,也就是1位数的时候有1个1
0~99 有10 * n1 + 以1开头的时候(一共10个数) = 20个1,记n2 = 20
0~999 有10 * n2 + 以1开头(一共100个) = 300个
...................
剩下的就比较好判断了,比如给你一个数,4527,那么它含有
0~999 n3
1000~1999 n3 + 1000
2000~2999 n3
3000~3999 n3
4000~4527 = 0~527 = 0~500 + 0~27 = 5 * n2 + 100 + 2*n1 + 10 + 1
(以上的内容我也只是大致计算以下,仅提供思路,具体数字如果不正确请自己验证)
这样算应该比你那样算快,你可以直接求出给的两个数有多少个1然后相减就行了
qq14344545 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
0~9里面有一个1
10~19里面,如果不考虑十位,也只有一个1
20~29里面只有一个1
30~39里面只有一个1
4
5
6
7
8
9.....
所以,0~99中间有19个1,也就是说每100个数,只需要判断一次

这个题目,用递归应该比较合适。以上是大致思路,仅供楼主参考。
[/Quote]1100~1200 和 0 到 100 明显是不同的
pathuang68 2012-07-22
  • 打赏
  • 举报
回复
0~9里面有一个1
10~19里面,如果不考虑十位,也只有一个1
20~29里面只有一个1
30~39里面只有一个1
4
5
6
7
8
9.....
所以,0~99中间有19个1,也就是说每100个数,只需要判断一次

这个题目,用递归应该比较合适。以上是大致思路,仅供楼主参考。
qq14344545 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
我觉得楼主这样的算法效率太差了,估计你会超时。居然每一个数字都去判断。这样肯定会很慢的。可以考虑设置一个区间判断。比如:1--10,共2个...
[/Quote]大神给个样例被
sjjwind 2012-07-22
  • 打赏
  • 举报
回复
LS说的对啊,你要这么做不超时,那就是数据太弱了,正确方法在LS
W170532934 2012-07-22
  • 打赏
  • 举报
回复
我觉得楼主这样的算法效率太差了,估计你会超时。居然每一个数字都去判断。这样肯定会很慢的。可以考虑设置一个区间判断。比如:1--10,共2个...
skillart 2012-07-22
  • 打赏
  • 举报
回复
在王晓东的算法书有一道例题。一本书页数从第一页到最后一页,统计页数中0,1,2,3。。。9各出现的次数。递归出一个简单的表达式。(现在没有带书自己可以搜一下咯)
直接代入找到1到b之间1的个数,减去1到a-1之间1的个数,不就直接得到a,b之间1的个数了吗。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧