内容正文:
(2)for(i=2;i<=m;i++)改为for(i=2;i<=m
-1;i++)
(3)if(flag==0)改为if(flag==1)
3.for(i=2;i<=n;i++)
{while(n! =i)
if(n%i==0)
{printf("%d∗",i);
n=n/i;
}
elsebreak;
}
printf("%d",n);
4.#include"stdio.h"
intmain()
{ inti,j;
for(i=3;i>=1;i--)
{ for(j=1;j<=4-i;j++)
printf("");
for(j=1;j<=i∗2-1;j++)
printf("B");
printf("
");
}
for(i=2;i<=3;i++)
{ for(j=1;j<=4-i;j++)
printf("");
for(j=1;j<=i∗2-1;j++)
printf("B");
printf("
");
}
}
第5节 循环结构应用
【巩固练习】
1.#include"stdio.h"
intmain()
{ longp=1,t=0;
inti,x;
doubles=0;
scanf("%d",&x);
for(i=1;i<=x;i++)
{ p=p∗i;
t+=p;
s=s+t∗1.0/(i∗i);
}
printf("s=%lf",s);
}
2.#include"stdio.h"
#include"math.h"
intmain()
{ inti,j,k;
for(i=-2;i<=2;i++)
{ for(j=1;j<=24+abs(i);j++)
printf("");
for(k=1;k<=3;k++)
{ for(j=abs(i)-2;j<=2-abs(i);j++)
printf("$");
if(k<=2)
for(j=1;j<=abs(i)∗2;j++)
printf("");
}
printf("
");
}
}
3.#include"stdio.h"
intmain()
{ intag,as,bg,bs,add1,add2,add,n=0;
for(ag=0;ag<=9;ag++)
for(as=1;as<=9;as++)
for(bg=0;bg<=9;bg++)
for(bs=1;bs<=9;bs++)
if(ag==7||ag==9||as==7||as==7)
if(bg==7||bg==9||bs==7||bs==7)
{ add1=ag+as∗10;add2=bg+bs∗10;
add=add1+add2;
n++;
printf("%d+%d=%d\t",add1,add2,add);
02
单招零距离计算机专业综合下册
if(n%5==0)printf("
");
}
}
4.①0 ②2 ③pow(x,2∗i-1)/jc ④j<=n
5.①m-1 ②m+1 ③next++ ④m
6.①mz<nz ②mz%nz ③mz
④test1∗test2/g2或test1∗test2/mz
【拓展练习】
1.chari,j,k;
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
{ if(i! =j)
for(k='x';k<='z';k++)
if(i! =k&&j! =k)
{ if(i! ='x'&&k! ='x'&&k!
='z')
printf("orderisa与%c\tb
与%c\tc与%c
",i,j,k);
}
}
2.#include"stdio.h"
intmain()
{ ints,t,s1;
scanf("%ld",&s);
s1=s;
t=s1%10;
s1=s1/10;
while(s1)
{ if(t>=s1%10)
{ t=s1%10;
s1/=10;
}
else
break;
}
if(s1==0)printf("%d是升序数",s);
elseprintf("%d是非升序数",s);
}
3.①1 ②temp>10 ③temp%10∗quan ④10
4.①10 ②count++或count+=1等 ③0
④k>max
【技能实践】
1.①65+(j%2? 0:1)②'A'+3
2.①for(i=0;i<20;i++)
②for(j=2;j<beijian;j++)
③}while(! flag||beijian<jian);
3.inti,a,b,c,min,max,gys,gbs;
printf("请输入三个整数,用逗号隔开:");
scanf("%d,%d,%d",&a,&b,&c);
min=a;
if(b<min)min=b;
if(c<min)min=c;
max=a;
if(b>max)max=b;
if(c>max)max=c;
for(i=min;i>=1;i--)
if(a%i==0&&b%i==0&&c%i==0)
break;
gys=i;
for(i=max;i<=a∗b∗c;i++)
if(i%a==0&&i%b==0&&i%c==0)
break;
gbs=i;
printf("最大公约数是:%d,最小公倍数是:%
d",gys,gbs);
4.longnum,count=0,num1,num2,i,p;
scanf("%ld",&num);
num1=num;
while(num1)
{ num1/=10;
count+=1;
}
p=i=1;
while(i<count)
{ i++;p∗=10;
}
num2=num;
for(i=1;i<=(count-1)/2;i++)
{ num2=num2%p;
p/=100;
num2=num2/10;
}
printf("%ld,%ld",num,num2);
12
总复习方案参考答案
总复习方案·第五章循环结构程序设计
/米米米米米***米米*END*米米米**米米米*米
}
4.程序设计题:用双重循环输出如下图形:
BBBBB
BBB
B
BBB
BBBBB
#include <stdio.h>
int main()
{
/*关共兴米米米米**米BEGIN米***米米米***米/
/**米兴米*米关*并*END米****并米关米米米/
第五节循环结构应用举例
知识体系
©Y©
循环次数
累加累乘
文本作图
穷举法
循环结构应用
递推法
素数
公约数公倍数
整数处理
·109·
单招零距离·计算机专业综合·下册
知识梳理
©⑤
一、循环次数
典例精析
©⊙
【例1】写出下列程序的运行结果。
#include "stdio.h"
int main()
int i,j,s1,s2,s3,s4,k,t;
s1=1;s2=2;s3=3;s4=4;
for(i=1;i<=3;i++)
{s1=s1+1;
for(j=1;j<=i;j++)
{for(k=1;k<=j;k++)
{s2=s2+2;
s3=s3+s4;s4=s3-s4;s3=s3-s4;
}
printf("s1=%d,s2=%d,s3=%d,s4=%d",s1,s2,s3,s4);
【分析】中层循环及内循环都受前其外循环变量的影响,所以还是用列表法列出循环次数。
i=1j=1k=1
G=1k=1
i=2
j=2
k=1
k=2
j=1
k=1
k=1
j=2
k=2
i=3
k=1
j=3
k=2
k=3
s1不难看出结果,s2=s2十2;受内循环控制,计10次,而s3=s3十s4;s4=s3一s4;s3=s3
一s4:实质上是加减法交换s3,s4两个变量,交换了10次,则等同没有交换。
【答案】程序运行结果为:
s1=4,s2=22,s3=3,s4=4
二、累加累乘
【例2】求x=y/1!十y/2!+y/3!++y/n!y和n由键盘输入。
【分析】阶乘可以用循环来体现,同时用累加器对每次的阶乘(阶乘放到分母上,分子为y)
·110·
总复习方案·第五章循环结构程序设计
进行累加,但要注意累加时的数据类型。
【答案】
#include <stdio.h
int main()
int y,n,i,p=1;
double sum=0;
scanf("%d",&y);
scanf("%d",&n);
for(i=1;i<=n;i++)
p=p*i;
sum=sum+1.0/p y;
}
printf("sum=%lf",sum);
}
三、文本作图
【例3】编程输出如下图形。
SSS
SSSSS
SSSSSSS
【分析】此图形一般用双重循环来控制输出,外循环控制行数,内循环控制列数,每行前
如有空格数的变化可以用另一个循环来控制,内循环输出一行后要换行,列表分析如下:
行数i
列数j
每行前空格数
1
1
心
2
3
2
3
5
1
4
7
0
i
2¥i-1
4-i
【答案】
#include "stdio.h"
int main()
int i,j;
for(i=1;i<=4:i++)
{for(Gj=1;j<=4-i;j++)
printf("");
for(G=1;j<=2*i-1;j++)
printf("s");
printf("
");
·111·
单招零距离·计算机专业综合·下册
}
}
【例4】编程输出如下图形。
$
$$$
$$$$$
$$$
$
【分析】此为对称图形,可以借用数轴的思想来理解编程。
行数i(y轴坐标)
列数j(x轴坐标)
每行前空格数
-2
00
2
-1
-1~1
1
0
-2~2
0
1
-1~1
1
2
0~0
2
i
abs(i)-2~2-abs(i)
abs(i)
【答案】
#include "stdio.h"
#include "math.h"
int main()
inti,j;
for(i=-2:i<=2:i++)
for(j=1;j<=24+abs(i);j++)
printf("")
for(j=abs(i)-2;j<=2-abs(i);j++)
printf("$");
printf("
");
}
四、穷举法
【例5】一千元钱,想买一百只鸡,每只大公鸡价值50元钱,每只母鸡价值30元钱,每3
只小鸡价值10元钱,现有1000元想买100只鸡,问大公鸡、母鸡、小鸡各应买几只?
【分析】此为不定方程问题,一般用穷举法来解决。所谓穷举就是把可能性用循环列举出
来,符合要求的则输出。循环尽量缩小范围,否则耗费计算机执行时间。这里我们把co©k的范
围大致到19只,hen大致到33只,chick用chick=100一cock一hen;来表示,再符合1000元钱就
是我们要的。注意cock*50+hen*30+chick*10/3.0==1000表达式中3.0的含义。
【答案】
#include "stdio.h"
·112·
总复习方案·第五章循环结构程序设计
int main()
int cock,hen,chick;
for(cock=0;cock<=19;cock+)
for(hen=0;hen<=33;hen++)
chick=100-cock-hen;
if(cock 50+hen 30+chick 10/3.0==1000)
printf("cock=%d\then=%d\tchick=%d
",cock,hen,chick);
}
【例6】2022年暑假,某歌星来到盐城花海开演唱会,有五位同学特别喜欢该歌星,买了
五张门票,这五位同学分别叫做小红、小玉、小明、小刚、小强,这五张门票有如下特点:
1)座位是挨着的,分别为1、2、3、4、5,演唱会门票有一张是靠边的(座位1为靠边):
2)小红是不喜欢坐边上的,但是小红想挨着小玉.;
3)小玉不想挨着小明,小明想挨着小刚,小刚不想挨着小强.:
假设小红为i、小玉为j、小明为k、小刚为P、小强为q,参考程序运行结果,为符合五个同
学的排列意愿。编程完成所求。
2
4
-5
2
3
【分析】小红为i、小玉为j、小明为k、小刚为p、小强为q;
五个变量肯定不能相等,则有:
i!=j8&i!=k&&i!=p&&i!=q&&j!=k&&j!=p&&j!=q&&k!=
p&.&.k!=q&.&p!=q
小红:i!=1&&(i==j+1li==j-1);
小玉:j!=k-1&8j!=k+1;
小明:k==p十1|k==p-1;
小刚:p!=q+1&&p!=q-1;
【答案】
#include "stdio.h"
int main()
int i,j,k,p,q;
for(i=1;i<=5;i++)
/小红
forj=1;j<=5;j++)
/小玉
·113·
单招零距离·计算机专业综合·下册
for(k=1:k<=5;k++)
/小明
for(p=1;p<=5;p++)
/1小刚
for(q=1;g<=5;q++)
/小强
if(i!=j&&i!=k&&i!=p&&i!=q&&j!=k&&j!=p&&j!=
q&&k!=p&&k!=q&&p!=q)
if(i!=18.&(i==j+1|li==j-1)
ifj!=k-1&&j!=k+1)
if(k==p+1|Ik==p-1)
if(p!=q+1&&p!=q-1)
printf("小红-一%d小t小玉-一%d\t小明一一%d小t小刚一一%d八t小强-一%d
t
",i,j,k,p,q);
}
五、递推法
【例7】小猫第一天钓了若干条鱼,第一天吃了一半,不过瘾又多吃了一条。第二天又将
剩下的鱼吃掉一半,又多吃了一条。以后每天都吃前一天剩下的一半多一条。到第十天只剩
下两条鱼了,问:第一天一共钓了多少条鱼?编程求解。
【分析】此类问题为已知后面的,求前面的。由于变化规律一样,所以要找到递推式,用
循环往前推就能求解。
假设第二天为x2,第三天为x。则第二天吃了x2/2+1,剩余x2一(x/2+1)给第三天,
则有x3=x2一(x2/2十1),根据已知后面的,求前面的,则有x2=2*(x3+1);同理有:
xg=2¥(x10+1);
xg=2*(x9十1);
X2=2*(x3十1);
x1=2*(x2+1);
前推9次则得解。等效递推关系式x=2¥(x十1)加循环就行了。
【答案】
int x,i;
x=2;
for(i=9;i>=1;i--)
x=(x十1)*2;
printf("x=%d",x);
}
【例8】编程求出下列表达式的值,x从键盘输入。
1+
1
1
1+
1
1+
1
1+
1+
1+
·114·
总复习方案·第五章循环结构程序设计
【分析】从表达式看,可以发现递推关系为1+1/x→x,再往上推6次,则能得最后的结果。
【答案】
#include "stdio.h"
int main()
int i;
float x;
scanf("f",&.x);
for(i=1;i<=6:i++)
x=1+1/x:
printf("x=%f",x);
}
六、素数
【例9】验证从键盘上输入的所有大于或等于4的偶数都可以分解为两个素数之和,只
要输出一对就行。
【分析】本题关键是把键盘输入的数×拆分成两个加数:s1,x一s1,再分别判断是否是素
数,如两个都是素数,则找到符合要求的两个素数之和;由于用do循环,所以s1从1开始,逐
步递增。
【答案】
#include "stdio.h"
#include "math.h"
int main()
int i,sl,tl,t2,x;
do
{printf("请输入一个大于或等于4的偶数:
");
scanf("%d",&x);
}while(x<4||x%2!=0);
s1=1;
do
{s1++;
t1=1;
for(i=2;i<=sqrt(s1);i++)
f(s1%i==0)
{t1=0:
break;
if(t1!=0)
{t2=1;
for(i=2;i<=sqrt(x-s1);i++)
if((x-s1)%i==0)
{t2=0;
·115·
单招零距离·计算机专业综合·下册
break;
}while(t1==0||t2==0);
printf("%d=%d++%d
",x,s1,x-s1);
七、公约数公倍数
【例10】用辗转相除法求输入的两个整数的最大公约数及最小公倍数。
【分析】用辗转相除法求两个整数的最大公约数,主要是掌握以下辗转式:
y
r=x%oy
y
r=x%y
最小公倍数等于两数的积除以这两个数的最大公约数。
【答案】
#include "stdio.h"
int main()
int m,n,r,x,y,temp;
printf("请输入两个整数:");
scanf("%d%d",&m,&n);
x=m;y=n;/用x,y求解最大公约数,防止丢掉原来的值m,n
if(x<y)(temp=x;x=y;y=temp;}
r=x%y;
while(r!=0)
{x=y;
y=r;
r=x%oy;
printf("最大公约数是:%d,最小公倍数是:%d",y,m*n/y);
八、整数处理
【例11】编程求出整数n各位数之和,同时输出各位数字,之间用逗号隔开。如输入
12345,结果为:
5,4,3,2,1
S=15
【分析】因为不知道整数是多少位,所以不好直接用表达式来表示各位数;但可以不断用
求余10及整除10来从后向前求出各位数。另外最后如n剩一位数,则输出不带逗号。
【答案】
#include "stdio.h"
int main()
long n;
·116·
总复习方案·第五章循环结构程序设计
int s=0;
printf("请输人一个整数:");
scanf("%ld",&.n);
x=n;q=1;
do
{x=x/10:q=q*10;
)while(x>>10);
while(n!=0)
{s+=n/q;
if(n>10)printf("%d,",n/q);
else printf("%d",n%10);
n=n%qq/=10;
printf("
s=%d",s);
【例12】编程判断一个整数是否是回文数。如12321则是回文数,1232则不是回文数。
【分析】要判断一个整数是否是回文数,只要把它的逆序数求出来,再与之判断是否相
等,如相等则是回文数。要求一个整数num的逆序数,只要从后向前取出各位数,再利用形如
s=s*10十num%10;这样的式子进行不断累加就行。
【答案】
#include "stdio.h"
int main()
long m=12321,s=0,num;
num=m;
while(num!=O)
{s=s*10+num%10;
num=num/10;
if(s==m)
printf("%d是回文数",m):
else
printf("%d不是回文数",m);
巩固练习
1.编程求下列计算式:x从键盘输入。
是+”+24+”+2+81++业+21+++
22
32
x?
#include"stdio.h"
int main()
·117·
单招零距离·计算机专业综合·下册
{
/**关米米关关米米END米米米米*米米*米/
}
2.用循环的嵌套编程输出如下图形。
s
$
$
$$$
$$$$$$$$$$$$$$$
$$$
5
#include "stdio.h"
include "math.h"
int main()
{
/柴**米米米0米米米*BEGIN米*米*米米米米米*米/
/关米关关关米关关关关米END米关*关关关米*米米米/
}
3.实验小学六班同学在计算两位数加两位数时,凡是有7或9在其中时,出错几率就高,
张老师为了多出一些这样的计算题,就请他的女儿贝贝编程把这样的题找出来,以便他能从中
抽取一些试题给学生训练,而且一行显示五题。假如是你,该怎样编程?
include "stdio.h"
int main()
¥BEGIN米**米/
·118·