C语言编程 算数出现奇怪的问题

有一个程序,如果数字满足下面两个条件,则显示该数字,如果不满足,则数字递增1,条件如下:能被3整除个十百千位至少有一个为数字3本程序从1000到9999递增。奇怪的是:在... 有一个程序,如果数字满足下面两个条件,则显示该数字,如果不满足,则数字递增1,条件如下:
能被3整除
个十百千位至少有一个为数字3
本程序从1000到9999递增。
奇怪的是:在源码第23行,如果用printf函数打印文字(无论是什么),那么所得出的结果完全正常。如果屏蔽此行,那么打印出来的结果有错误,比如说会出现9981这样不符合要求的数字。求解,并告诉我为什么会出现这样的问题???
以下为C源码:
----
#include <stdio.h>
int just(int a);
void main(void){
int a=0,m,max=9999,min=1000;
printf(" NOTICE:\nPRESS ANY KEY TO CALCULATE NUMBERS FROM 1 000 TO 9 999 !\n\n");
system("pause");
for(;min<=max;min++)
{
m=just(min);
if(m==1)
{m=0;printf("%d\n",min);a++;}
}
printf("Total numbers:%d\n",a);
system("pause");
}
int just(int k){
int i,b=10,ge,shi,bai,qian;
if(k%3!=0)
return 0;
qian=k/1000;
bai=(k-qian*1000)/100;
shi=(k-qian*1000-bai*100)/10;
ge=k-qian*1000-bai*100-shi*10;
printf("\n");
if(qian==3)
return 1;
if(bai==3)
return 1;
if(shi==3)
return 1;
if(ge==3)
return 1;
}
----------
抱歉,是第24行的printf()函数,不是第23行
展开
 我来答
铁打的泥人
2014-07-19 · TA获得超过2068个赞
知道小有建树答主
回答量:741
采纳率:50%
帮助的人:374万
展开全部
语句去掉printf()才是正确的
你这个有两个条件,一个是被三整除,一个是要有三这个数字
而自定义函数必须要有返回值,返回值有两种形式,一种是return语句,一种是碰到printf语句也是返回值
所以,加了printf,则函数到这里就调用结束,所以选的只是被3整除的,总数有3000个,而去掉了printf,则后面的语句同样执行,选出的是同时符合两个要求的
另外,你这个之所以出现了9981这样不符合的,是因为9981能被3整除,但是没一个是3,但是函数里对这种情况又没有返回值,所以默认返回1,所以打印出来了,
if多个语句改为if else if嵌套就行了,最后一个else return 0就行了
望采纳
追问
加上printf,返回有1056个(这应该是正确的)
不加上printf,返回有1272个(不正确)
这是为什么啊
追答

不加上这个,你这个不是每一次调用函数都有返回值的,如9981就没有返回值

上面最后也提到了

不加printf

改一下if语句,最后结果也是1056个

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
战地巫师
2014-07-19
知道答主
回答量:27
采纳率:0%
帮助的人:10.9万
展开全部

拜托以后传代码选一下代码语言,不然这复制到VC++里面全在同一行,,,,一点儿缩进换行都没有,,,,

#include <stdio.h>

int just(int a);

void main(void)

{

 int a=0,m,max=9999,min=1000;

 printf("   NOTICE:\nPRESS ANY KEY TO CALCULATE NUMBERS FROM 1 000 TO 9 999 !\n\n");

 system("pause");

 for(;min<=max;min++)

 {

  m=just(min);

  if(m==1)

  {

   m=0;

   printf("%d\n",min);

   a++;

  }

 }

 printf("Total numbers:%d\n",a);

 system("pause");

}

int just(int k)

{

 int i,b=10,ge,shi,bai,qian;

 if(k%3!=0)

  return 0;

 qian=k/1000;

 bai=(k-qian*1000)/100;

 shi=(k-qian*1000-bai*100)/10;

 ge=k-qian*1000-bai*100-shi*10;

 printf("\n");

 if(qian==3)

  return 1;

 else if(bai==3)

  return 1;

 else if(shi==3)

  return 1;

 else if(ge==3)

  return 1;

 else

  return 0;

}

你的判断数字中含不含3的语句是错的,,,,,,,,,

追问
谢谢了,但是我还想知道为什么加上printf语句就能返回正常的值呢?
追答
你是说在printf的\n前面加文字?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kaixingui2012
2014-07-19 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6433万
展开全部
9981能被3整除啊!!!!!
怎么不对?
更多追问追答
追问
不满足条件2啊,个十百千位没有3
追答
哦,我理解了,你是两个条件都要满足啊,我再看看
if(qian==3)
return 1;
if(bai==3)
return 1;
if(shi==3)
return 1;
if(ge==3)
return 1;
这一堆if之后,少了一个其他的返回值
return 0; //不满足以上条件的,都返回0 如果不加这个,默认的返回信息是不确定的值,因此,会导致结果出现错误的数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式