pick me我啊我百度云:会c语言的大哥进~~~

来源:百度文库 编辑:高考问答 时间:2024/05/11 16:11:39
编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。
#define MAX 200
int a[MAX], b[MAX], cnt = 0 ;

void jsVal()
{ int i,j,qw,bw,sw,gw;
for(i=0;i<MAX;i++)
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
if(qw&&qw%2==0&&bw%2==0&&sw%2==0&&gw%2==0) b[cnt++]=a[i];
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]<b[j]) { qw=b[i]; b[i]=b[j]; b[j]=qw;}
}

我觉得这条的答案似乎有点问题~
我将它给改为:
~~~
for(i=0;i<MAX;i++)
{ qw=a[i]/1000; bw=a[i]/100;
sw=a[i]/10; gw=a[i];
if(qw%2==0&&bw%2==0&&sw%2==0&&gw%2==0) b[cnt++]=a[i];
}
~~~~~
对吗??
我的这样的算法主要是觉得没有必要把每位上的数都算出来~
正如楼下所说如果这个数为2468,即a[i]=2468
那么正确的结果是bw=4;sw=6;gw=8
而我的结果是 bw=24;sw=246;gw=2468
我认为只要bw,sw,gw只要是2的倍数就可以了,不管它是几位数~~
我这样的想法对吗?

都有错,应该是:
....
{ qw=a[i]/1000; bw=a[i]/100%10;
sw=a[i]/10%100; gw=a[i]%10;
....
qw代表千位数,bw代表百位数,依此类推,你去用笔算一下,是不是我这样算,你那算法肯定错,原来的题目估计是印错了一个符号.
补充:按你那想法好象是可以,但最好不要那样算,我暂时看不出你那样算有没有其他错误,结果应该是没错,但思维有点问题,是按原题目那样算肯定不会有错,一般编程的思维都是那样的,你那样算有点怪怪的.

你改了两个地方
一个是把bw=a[i]/100%10;
sw=a[i]%100/10; gw=a[i]%10;
该成了bw=a[i]/100;
sw=a[i]/10; gw=a[i];
如果这个数为2468,即a[i]=2468
那么正确的结果是bw=4;sw=6;gw=8
而你的结果是 bw=24;sw=246;gw=2468
这肯定是不对的啊
还有个地方
你将qw&&qw%2==0改成了qw%2==0
其实前面把qw与进去是为了判断千位是不是为0
因为题目说了4位数
如果千位为0就是3位数了
如果你在一开始就加个if语句判断下也是可以的
否则就要到这里判断

前面QW保证千位的数字不是零,也就是说确认是个四位以上的数…………

程序没有那么复杂吧!

如果题目只要求这样的话,有一个好的办法

你可以尝试用 字符数组 c[5]

scanf("%s",c);

然后逐个判断ASCII码

可以用四个循环变量,四层嵌套循环,每个变量从8到0(表示千位的到2就行了),递减2,不就行了。