新手请教,编了一个C程序,运行起来很诡异,高手赐教!

punction 2010-08-25 02:52:19
输入最多5位数,判断数字一共几位,并输出位数。
运行结果很诡异。五位数 98304是临界点,超过这个,输出就是1204,;小于98304,输出就是5位,大家帮看下问题出在哪里。

#include<stdio.h>
void main()
{
int x,y;
while(scanf("%d",&x))
{
if(x>=0)
{
if(x>=10)
{
if(x>=100)
{
if(x>=1000)
{
if(x>=10000)
y=5;
else y=4;
}
else y=3;
}
else y=2;
}
else y=1;
}

// else y=1;
printf("%d\n",y);
}
}
...全文
461 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
vipvvv 2010-09-10
  • 打赏
  • 举报
回复
lz应该是在tc中运行的,那样int类型为16位,
草原牧心 2010-09-10
  • 打赏
  • 举报
回复
这种程序的注意点就是 变量类型 取值范围 和计算符号问题
你的程序懒的看
jsjs5200 2010-09-09
  • 打赏
  • 举报
回复
楼主用了太多的if了,这样使得代码的可读性就下降了~~~说得通俗点 就是 看着太费劲了~~~用vs2008运行了一下,没有出现楼主说的问题,可能是编译器不同吧
zhe007 2010-09-09
  • 打赏
  • 举报
回复
哥都一年没摸C++了……
heaven7_23 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fyn309 的回复:]
引用 2 楼 l176266956 的回复:

很抱歉,用VC6运行了一下,没发现你说的问题

同上
[/Quote]
同上
solomon_xu 2010-09-09
  • 打赏
  • 举报
回复
VC6的int类型是8位的吧,如果设置为unicode,应该为16位的吧。
建议在数字运算时使用float类型。
FYN309 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 leaveboy 的回复:]

个人认为6楼的思路比较好,除法运算是比较耗资源的,才用scanf("%s",&x)再strlen比较好!当然这个输入只能是数字(这个在题目中应该是预设为数字,如果采用数字,每个程序都要进行排错处理)!更何况添加一个while循环,复杂度变高!

C/C++ code
#include <stdio.h>
#include <string.h>

int main(void)
{
……
[/Quote]
需要加上#include <iostream>吧
FYN309 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 l176266956 的回复:]

很抱歉,用VC6运行了一下,没发现你说的问题
[/Quote]
同上
tomatobin 2010-09-08
  • 打赏
  • 举报
回复
。。。利用循环做会使代码好看一些
zyj_604 2010-09-07
  • 打赏
  • 举报
回复
lz不要灰心啊
学c先把基础弄好,
然后看一些规范,多看看别人的代码,养成写代码规范的习惯
然后再考虑算法
代码一定要规范一点,这样自己看和别人看都方便
yanpingsz 2010-09-06
  • 打赏
  • 举报
回复
是超过int x的有效范围了吧,不同的编译器好像int的范围不一样
dushishan123 2010-09-03
  • 打赏
  • 举报
回复
我也刚开始学习楼主可以加我QQ276648947大家一起学习~~
kouji1990 2010-09-03
  • 打赏
  • 举报
回复
没问题,挺好
ForestDB 2010-08-30
  • 打赏
  • 举报
回复
LZ的编译环境是TC?
顺便改改程序的流程吧。
tangxiaojun888 2010-08-26
  • 打赏
  • 举报
回复
学习一下
leemeng0x61 2010-08-26
  • 打赏
  • 举报
回复
至于楼主诡异之说应该是整型越界,用long long就可以了
leemeng0x61 2010-08-26
  • 打赏
  • 举报
回复
个人认为6楼的思路比较好,除法运算是比较耗资源的,才用scanf("%s",&x)再strlen比较好!当然这个输入只能是数字(这个在题目中应该是预设为数字,如果采用数字,每个程序都要进行排错处理)!更何况添加一个while循环,复杂度变高!

#include <stdio.h>
#include <string.h>

int main(void)
{
int len = 0;
char buffer[256]={0};

scanf("%s",buffer);
len = strlen(buffer);
printf("\nnum:%d\n",len);

system("pause");
return 0;
}
punction 2010-08-25
  • 打赏
  • 举报
回复
请问,我看到digit这个变量被赋予了两次初值0,可否把循环外面的定义变量是赋值去掉,编程int digit ?[Quote=引用 5 楼 hairetz 的回复:]

C/C++ code

int main()
{
int x,y;
int digit = 0;
while(scanf("%d",&x))
{
digit = 0;
while(x>0)
{
++digit;
x/=10;
}
……
[/Quote]
rockysheng19 2010-08-25
  • 打赏
  • 举报
回复
在VC2003下运行完全正常,只是楼主的逻辑太复杂了
yaganblw 2010-08-25
  • 打赏
  • 举报
回复
int数据的范围为-32768—32767,不能超过这个范围。
在TC中是这样。。。
加载更多回复(11)

33,319

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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