c语言循环结构经典算法

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

循环结构经典算法

1、编程输出1至100之间能被17整除的自然数(要求使用continue语句)算法分析:

如果自然数i被17整除,予以输出,否则不输出

源程序1:

#include

void main()

{

int i ;

for(i=1; i<=100; i++){

if (i%17==0) p rintf("%4d", i);

}

printf("\n");

}

源程序2:(with Continue)

#include

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

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

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

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

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

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

相关文档
最新文档