c语言循环结构经典算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

循环结构经典算法
1、编程输出1至100之间能被17整除的自然数(要求使用continue语句)算法分析:
如果自然数i被17整除,予以输出,否则不输出
源程序1:
#include <stdio.h>
void main()
{
int i ;
for(i=1; i<=100; i++){
if (i%17==0) p rintf("%4d", i);
}
printf("\n");
}
源程序2:(with Continue)
#include <stdio.h>
void main()
{
int i ;
for(i=1; i<=100; i++){
if (i%17!=0) continue;
printf("%4d", i);
}
printf("\n");
}
2、求100之内能被17整除的最大自然数(要求使用break语句)
算法分析1:
如果自然数i(i=1, 2,…,100)被17整除且大于其他能被17整除的自然数,保存下来,循环结束时予以输出
源程序1:
#include <stdio.h>
void main()
{
int i, max=0 ;
for(i=1; i<=100; i++)
if (i%17==0 && i>max) max=i;
printf("%d\n",max);
}
算法分析2:
如果自然数i(i=100, 99,…,1)被17整除,提前结束循环,输出i即可
源程序2:(with break)
#include <stdio.h>
void main()
{
int i,max=0 ;
for(i=100; i>=1; i--)
if (i%17==0 ) break;
printf("%d\n",max);
}
3、编程打印出下列图案:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * *
* * * * *
* * *
*
算法分析:
(1)该图案共9行,每行由空格’’、星号’*’、换行’\n’组成
(2)第1至第5行的空格呈递减趋势(4,3,2,1,0),即每行的数量等于5-i;而’*’呈增加趋势(1,3,5,7,9),即每行的数量等于2i-1;
(3)第6至第9行的空格呈增加趋势(1,2,3,4),即每行的数量等于i-5;而’*’呈减少趋势(7,5,3,1),即每行的数量等于2(9-i)+1;
(4)每行末尾都是1个换行符
源程序:
#include <stdio.h>
void main()
{
int i,j ;
for(i=1; i<=5; i++) { //先输出1~5行
for(j=1;j<=5-i; j++) putchar(' '); //先输出5-i个空格
for(j=1;j<=2*i-1; j++) putchar('*'); //再输出2i-1个*
putchar('\n'); //行尾换行
}
for( ; i<=9; i++) { //再输出6~9行
for(j=1;j<=i-5; j++) putchar(' '); //先输出i-5个空格
for(j=1;j<=2*(9-i)+1; j++) putchar('*'); //再输出2(9-i)+1个*
putchar('\n'); //行尾换行
}
}
思考:
(1)本程序中使用函数putchar()实现字符输出,如果使用printf(),括号内的参数使用单引号还是双引号?
(2)第二个for循环的表达式1是空的,为什么?
(3)如果把第二个for循环改成如下形式,循环体应该怎样更改?
for( i=4; i>=1; i--){
/* 请在此处填写循环体语句
*/
}
4、分析下列程序的输出结果:
#include <stdio.h>
void main()
{
int i=-1, j=3, c ;
do{
c= (++i<0)&&!(--j==0);
i++;
}while(c); //当C非0时循环
printf("%d, %d\n", i,j);
}
结果:
1,3
分析:
循环次数i j c
0 -1 3 未知
1 1 3 0
首先执行++i,令i由-1增为0,表达式++i的值亦为0
关系运算++i<0的值为0,故运算&&的结果为0,c的值为0
!(--j==0)是&&的第二操作数,在已经明确&&结果为0时不再计算,因此j的值没有减1,由于do-while语句的循环条件是c,即c!=0,而当第一次循环结束时c为0,故结束循环
5、输入两个正整数m和n,求最大公约数p和最小公倍数q。

算法分析:
(1)假如m<=0或n<=0,提示输入有误,结束程序。

(2)假如两者均为正数,取小者赋予m,大者赋予n.
(3)先求最大公约数p:可知p必然小于等于m,因此可令p的值试着等于m,m-1,m-2,…,直到p既能整除m又能整除n.
(4)再求最大公倍数q:可知q必然大于等于n,因此可令q的值试着等于n,n+1,n+2,…,直到q既能被m整除,又能被n整除。

源程序
#include <stdio.h>
void main()
{
int i,m,n,p,q,r;
printf("Input two plus numbers:"); //输入整数m,n
scanf("%d%d", &m,&n);
if( m<=0 || n<=0) //输入出错,结束程序
printf("Invalid numbers!\n");
else{// m>0 &&n>0, 继续求解
if(m>n){ //对m,n排序,令m小,n大
r=m; m=n; n=r;
}
p=m; //求最大公约数
while( !(m%p==0&&n%p==0) ) //条件亦可为:m%p!=0||n%p!=0
p--;
q=n; //求最小公倍数
while( !(q%m==0&&q%n==0) ) //条件亦可为:q%m!=0||q%m!=0 q++;
printf("p=%d, q=\n",p,q);
}
}
思考题:如果事先不对m,n进行大小排序,p和q的初值应该怎么取?。

相关文档
最新文档