C语言程序求助!

#include "stdio.h"
main()
{ int num_list[]={6,7,8,9},k,j,b,u=0,m=4,w;
w=m-1;
while(u<=w)
{
j=num_list[u];
k=2;
b=1;
while(k<=j/2&&b)
{++k;b=j%k;}

if(b)
{ printf("%d\n",num_list[u]); u++;}
else
{
num_list[u]=num_list[w];
num_list[w]=j; w--;
}
}

}
请问这个程序是如何输出的?

首先看无论while怎么循环k都等于2,b都等于1.
程序开始:w=3进入最外层while循环,j=6,k=2,b=1;
在进入内层循环k<=6/2也就是2<=3为真,逻辑与上b也就是1,结果为真。
k自增为3,b=j%k也就是b=6%3 =0
在进入内层while循环,结果为假,跳过内层循环,进入判断语句。
由于b=0为假,所以执行else,数组list[]={9,7,8,6}. w=2.
第2次外循环:
进入外层while. u<=w 也就是0<=2为真
j=9,k=2,b=1.
进入内层循环,k<=j/2&&b 也就是 2<=9/2&&1 结果为真
k自增为3,b=j%k 也就是b=0 在进入内层while结果为假,进入判断语句
此时数组list={8,7,9,6} w自减为1
第3次外循环:
进入外循环判断 0<=1为真
j=8,k=2,b=1 进入内循环while 2<=8/2&&1 为真
k自增为3,b=8%3 b为2,在进入内循环while 3<=4&&2 为真
k自增为4 b=8%4 =0 在进入内循环while 为假---------------------------------注意这里内循环了2次喔!
进入判断语句 此时list={7,8,9,6} w=0
第4次外循环:
进入外判断while 0<=0 为真
j=7,k=2,b=1 进入内循环while 2<=7/2&&1 结果为真。
k自增为3 b=7%3 =1 进入内循环while 3<=3&&1
k自增为4 b为3 内循环为假
进入if语句
输入始终u=0的数组下表=7
是不是这样的?为啥我测试当w为0时,内循环只有1次呢?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-04
为什么有这么纠结的程序,我无聊一个个的数往里面代入..输出是7,
一个个的代的试嘛! 整个大循环运行四次结束,
w=3

u=0;w=3
j=6;
k=2;
b=1;
k=2; 3 b=1;
k=3;b=0;
list[0]=9;
list[3]=6;w=2

u=0.w=2
j=9
k=2
b=1
{ k=2.4.b=1
3.0.} 这里面是小while里的程序
list[0]=8
list[2]=9.w=1

u=0.w=1
j=8
k=2
b=1
{ k=2.4.b=1
3.2
3.4.2
4.0.}
list[0]=7
list[1]=8.w=0

u=0.w=0
j=7
k=2
b=1
{ k=2.3.b=1
3.1
3.3.1
4.3 }
k=4.j/2=3.b=3
这里4<3不成立,b=3为真,,,,开始执行if语句
list[0]=7,u=1 w=0
再u<=w
所以输出了7,程序终止了!~追问

小while里的怎么看不懂,这是怎么运行的,你能耐心的教我吗?
{ k=2.4.b=1
3.0.} 里面小while里程序
list[0]=8
list[2]=9.w=1

本回答被提问者和网友采纳
第2个回答  2014-04-04
你这个程序没有输出,因为“b=j%k”始终为0,无法进入"if(b)"语句,因此你在W自减4次后就程序跳出“while(u<=w)”循环,没有结果输出。追问

可是软件运行出来的答案和标准答案是相同的,结果为7,我是不太理解

追答

结果应该会输出 8 和7 把,之前的说法错误。
第一步:u=0,w=3 得到b=6%3=0,无法进入“if(b)” 所以num_list[]={9 ,7,8,6};

第二步:u=0,w=2 得到b=9%3=0,一样无法进入“if(b)" 所以num_list[]={8,7,9,6};
第三步:u=0,w=1 得到b=8%3=2,进入”if(b)" 所以输出num_list[u]=num_list[0]=8; u=1;num_list[]={8,7,9,6};
第四步:u=1,w=1 得到b=8%3=2,进入”if(b)" 所以输出num_list[u]=num_list[1]=7;u=2;num_list[]={8,7,9,6};
第五步:while(2<=1) 不成立。

追问

结果应该是7,

相似回答