傻了,这么短的程序还有问题

liangkaiyu 2009-03-03 10:07:55
一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9。

#include "stdio.h"
int main(){
int n;
int a[10] = {0};
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
while(i)
{
a[i%10]++;
i = i/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}


假设先不考虑大数,int范围内
急!!
...全文
235 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangkaiyu 2009-03-04
  • 打赏
  • 举报
回复
谢谢大家的支持!
分太少,
望各位牛人不要见怪!
lzonline01 2009-03-03
  • 打赏
  • 举报
回复
这个程序成死循环了
breezes2008 2009-03-03
  • 打赏
  • 举报
回复
来晚了....
几位楼上正解,是个死循环.只需要先保存i 值,然后再while循环就可以,然后再恢复i值。
cakes 2009-03-03
  • 打赏
  • 举报
回复
貌似是 初始化有问题
xidianxiancai 2009-03-03
  • 打赏
  • 举报
回复
#include "stdio.h"
int main()
{
int n;
int a[10] = {0};
int i;
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
while(i)//i永远不会为0的,因为有i++存在
{
a[i%10]++;
i = i/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}
liangkaiyu 2009-03-03
  • 打赏
  • 举报
回复
问题解决了,谢谢各位指正
俺果然是范了不可饶恕的错误!
traceless 2009-03-03
  • 打赏
  • 举报
回复
我的错了,只能在19以内成立

正解前面都有了,哎
ctan 2009-03-03
  • 打赏
  • 举报
回复
#include "stdio.h"
int main()
{
int n;
int a[10] = {0};
int i;
int tmp;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
tmp = i;
while(tmp)
{
a[tmp%10]++;
tmp = tmp/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}
jinggyu 2009-03-03
  • 打赏
  • 举报
回复
同意4楼!
修正后:
#include "stdio.h"
int main(){
int n;
int a[10] = {0};
int i, tmp;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
tmp = i;
while(tmp)
{
a[tmp%10]++;
tmp = tmp/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}

xiaoyuer5222 2009-03-03
  • 打赏
  • 举报
回复

#include "stdio.h"
int main(){
int n;
int a[10] = {0};
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int k=i;//这要用一个中间变量,不然的话每次while完后i=0for里i++=1;死循环了
while(k)
{
a[k%10]++;
k = k/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}
traceless 2009-03-03
  • 打赏
  • 举报
回复
我错了,数组元素也可以自加加的 呵呵
OenAuth.Core 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lightnut 的回复:]
C/C++ code
#include "stdio.h"
int main(){
int n;
int a[10] = {0};
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int k = i; //<=========
while(k)
{
a[k%10]++;
k = k/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}
[/Quote]
相当的快呀
barech 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chenzongquan1973 的回复:]
问题在于你在
for (i = 1; i <= n; i++)
{
while(i)
{
a[i%10]++;
i = i/10;
}
}
中i = i/10;这一行把i的值改了,里面的
while(i)
{
a[i%10]++;
i = i/10;
}
循环结束时i总是0,而外面for (i = 1; i <= n; i++)中你还用i <=n来控制,它永远这真。
[/Quote]

就是这样,该问题的根源在于:将循环控制的计数器用于计算,从而改变了真正的循环次数

traceless 2009-03-03
  • 打赏
  • 举报
回复
1 a[i%10]++;
> 数组是不能自加加的吧,太追求简洁了
2 把输出好看一些
> printf("%d:%d\n", i,a[i]);

OenAuth.Core 2009-03-03
  • 打赏
  • 举报
回复
while(i)
{
a[i%10]++;
i = i/10;
}

i每次出来都是0,你在for里面++就永远是1,死了
yashi 2009-03-03
  • 打赏
  • 举报
回复
不好意思,说错了,

不过错误还是在这几句,

你用i=i/10;修改了i的值,影响了for循环的正常执行
Cpp权哥 2009-03-03
  • 打赏
  • 举报
回复
改成
for (i = 1; i <= n; i++)
{
int j=i;
while(j)
{
a[j%10]++;
j = j/10;
}
}
就行了。
lightnut 2009-03-03
  • 打赏
  • 举报
回复

#include "stdio.h"
int main(){
int n;
int a[10] = {0};
int i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int k = i; //<=========
while(k)
{
a[k%10]++;
k = k/10;
}
}

for (i = 0; i < 10; i++)
printf("%d\n", a[i]);

return 0;
}

traceless 2009-03-03
  • 打赏
  • 举报
回复
 while(i)
{
a[i%10]++;
i = i/10;
}


改成:

a[i%10] = a[i%10] + 1;
Cpp权哥 2009-03-03
  • 打赏
  • 举报
回复
问题在于你在
for (i = 1; i <= n; i++)
{
while(i)
{
a[i%10]++;
i = i/10;
}
}
中i = i/10;这一行把i的值改了,里面的
while(i)
{
a[i%10]++;
i = i/10;
}
循环结束时i总是0,而外面for (i = 1; i <= n; i++)中你还用i<=n来控制,它永远这真。
加载更多回复(4)

69,369

社区成员

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

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