循环结构程序设计典型例题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析:用 变量
f=f1+f2,f1=f2,f2=f.
#in clude<stdio.h>
mai n()
{ long f1=1,f2=1,f, n;
for( n=3;n<=40 ;n++)
{f=f1+f2;
f1=f2; f2=f;
}
printf( nf=%ld”,f);
}
思考:求
例8:Sn=1-1/3+1/5-1/7+…1/(2n-1)求s(100)(保留4位小数)
{b=2698/a;
if(s>(a+b))
{s=a+b;
t=b;
}
}
}
printf( n“d' ,b);
}
#in clude<stdio.h>
#include“math.h”
mai n()
{double s,a=0,n;
for( n=1; n<=50 ;n++)
a=a+log( n);
s=sqrt(a);
printf( ns=%.6lf”,s);
}
例15:0<a<b,a*b=2698,且a+b最小,求b.
分析:用变量
(n%2!=0),s=s+1/(2*n-1),否则s=s-1/(2*n-1)。
#in clude<stdio.h> mai n() {int n;
float s=0;
for( n=1; *=100; n++) if(n %2!=0) s=s+1.0/(2* n-1) else s=s-1.0/(2* n-1); printf( nf.4f ” ,s);
{for(I=2;I<a;I++)
if(a%I==0) break;
if(a==I )
{b=a+2;
for(I=2;I<b;I++)
if(b%I==0) break;
if(b==I ) n++;
}
}printf( n%'d' ,n);
}
例
分析:用变量
因子的个数,
mai n()
{int a,c ,n=0,1;
5•
程序:
#in clude<stdio.h>
mai n()
{ long a,b,c,n=0;
for(c=1;c<=97;c++)
for(b=c+1;b<=98;b++) for(a=b+1;a<=99;a++)
if(a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b)
n++;
printf( n%ld”,n);
float s=0;
for(n=1; n<=30 ;n++)
{ s=s+(float)i/j;
c=i;
i=j+1; j=c+j;
}
printf( "n%f”,s);
}
此题中的n与循环体中的执行语句没有数值上的联系,仅仅用做决定循环执行的次数。
例2:下面这个程序,想想它实现的是什么功能?
#in clude<stdio.h>
}
特别注意此题中变量不能定义成
此题可做改进,在循环时确保
for(a=1;a<=99;a++)
for(b=1;b<=99;b++)
for(c=1;c<=99;c++)
if(a>b&&b>c&&a+b+c<100
&&c*c* (a*a+b*b)==a*a*b*b)
n++;
例6:e=1+1/1!+1/2!+….+1/n!(精度为1e-6)
可以不用最后察看i的值,而是通过在发现因子时改动标志变量,最后根据标志变量的值判 断是否是素数。
例5:有一个八层高的灯塔,每层所点灯数都等于上一层的两倍,一共有765盏灯,求塔底
灯数。
算法分析:
此题的关键在于塔顶的灯数,只要知道了塔顶的灯数,就可知道塔底灯数。这里采 取试探的方法来求塔顶灯数。
设塔顶灯数为x,x的初值从1开始循环,每次值加1。求出相应的灯的总数,总
mai n() {Hale Waihona Puke Baiduint i,s=0;
for(i=1;i<=100;i++)
{if(i%5==0) continue;
s=s+i;
}
printf( n“d' ,s);
}
在左边的程序中,i从1到100循环,当i是5的倍数时,直接进入下一个i,当i不是5的倍 数时,把i累加到s,最后输出s。所以,这个程序实现的是求1~100中间所有非5的倍数 的数之和。
i
程序:
#in clude<stdio.h>
mai n()
{ int a,s=0,i;
for(a=3;a<=150;a++)
{for(i=2;i<=a-1;i++)
if(a%i==O) break;
if(a==i) s=s+a;
}
printf( n“d' ,s)
}
求素数的方法很多,大同小异。此题可以做一些改动。如:i的值可以是从2取到sqrt(a);
{s=0;
for(l=1;l<a;l++)
lf(a%l==O) s=s+l;
if(a==s) break;
}
printf( n“d' ,a);
}
思考:求
例14:S=sqrt(ln(1)+ln(2) +…+ln(n)),n=50(结果保留6位小数)
分析:开平方数及自然对数都是
求得。注意函数定义的数据类型。
算法分析:
这是一道典型的三重嵌套循环的题目。a、b、c都是位于1到99之间整数。编程的基本思
路是:找出1到99之间的所有a、b、c的排列,察看同时满足a>b>c、a+b+c<100、1/a2+1/b2=1/c2这三个条件的a、b、c有多少组。值得注意的是,1/a2+1/b2=1/c2这个条件并不能简单的原
for( a=1000;a>=1;a--) {for( j=2;j<a;j++) if(a%j==0) break;
if( j==a)
{ s=s+a; I++; }
if(l==20) break;
}
printf( n“d' ,s);
}
例
分析:用变量
果
mai n()
{int a,b,n=0,1;
for(a=200;a<=998;a++)
项的分子加分母。解题思路是用循环语句求各项,并把值累加,因为是求前30项的和,循
环执行30次。
1.初值i=2,j=3,s=0;
2.用n从1到30循环
3.s=s+ i/j;
4.c=i; i=j+1; j=c+j;
5输出s;
程序:
#in clude<stdio.h>
mai n() {int i=2,j=3, n,c;
程序:
#in clude<stdio.h>
mai n()
{ int x,s,i,k;
for(x=1;;x++)
{s=0;
k=x;
for(i=1;i<=8;i++)
{s=s+k;k=k*2;}
if(s==765) break;
}
printf( n“d' ,k/2);
}例5:已知a>b>c>0,a、b、c为整数,且a+b+c<100,求满足1/a2+1/b2=1/c2的a、b、c共有 多少组?
for(a=n; a<=m;a++)
if(a%3==0)
{ x=a;
while(x>0)
{i=x%10;
if(i==5){printf (“%ld”,a);break;}
x=x/10;
}
}
}
问:能把
例
算法分析:
1.
2.
3.若a%i==0,结束i的循环,执行第4步
4.若i==a,把a累加到s上。
5.
注意:此题中执行第
样照写,因为在求分数的过程中必然有四舍五入,不能得出真正的准确的结果,必须把条件
变形成:C2(a2+b2)=a2b2才能得出正确的结果。
1.a从1到99循环
2.b从1到99循环
3.C从1到99循环
4.若a>b&&b>c&&a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b,统计找到了一组
}
例9:用牛顿迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2.5附近的实根,直到满足|xn-xn-1|<10-6为止。
牛顿迭代公式为:xn=xn-1-f(xn- 1)/f'-xn
算法分析:
牛顿迭代法认为,以任意一个
#in clude<stdio.h>
#in clude<math.h> mai n()
{ float x=2. 5,x0,f,f2;
do{ x0=x;
f=2*x0*x0*x0-4*x0*x0+3*x0-7;
f2=6*x0*x0-8*x0+3;
x=x0-f/f2;
}while(fabs(x-x0)>=10e-6);
printf(f %f” ,x);
}
例
分析:用变量
mai n()
{int a,s=0,I=0, j;
分析:用变量a从1至U sqrt( 2698)-1循环。变量s初值为6000。若2698%a==0,则b=2698/a,若s>a+b,则s=a+b,并保存b的值在变量t.
mai n()
{int a,b,s=6000,t;
for( a=1;a<sqrt(2698);a++)
{if(2698%a==0)
分析:用变量
环,t=t*i,e=e+1.O/t。
#in clude<stdio.h>
void mai n()
{ int i=1;
long t=1;
float e=1;
while(e-(i nt)e>=1e-6)
{ t=t*i;
e=e+1.0/t;
i++;}
printf( n“.10f”,e);
}
例7:数列1,1,2,3,5,8….有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求f(40)。
循环结构程序设计典型例题
例1有数列2/3、4/5、6/9、10/15……求此数列前30项的和。
算法分析:
对于数列的题,首先要找出通项公式,或前后项的计算关系公式,根据公式求所需。
由于数列的题一般执行次数能确定,用for语句来编写比较方便。
此题,前后项的关系是:后一项的分子是前一项的分母加1,后一项的分母是前一
数不为765,继续下一个x的循环,直到某次求得灯总数为765时,结束x的循环,输出此
时塔底灯数。
1.x从1开始循环,每次值加1
2•设k初值x,计算每层灯数。设s初值0,累加每层灯数
3.i从1到8循环,每次值加1
4.s=s+ k; k=k*2;
5.如果s==765,结束x的循环
4. s=s+ k; k=k*2;
例3:输出n~m中(0<*m)能被3整除,且至少有一个数字是5的所有数。
算法分析:
1
2
3•
4令整型变量x=a
5•
6.i=x%10
7•
8.x=x/10,并返回第5步
9•
程序:
#in clude<stdio.h>
mai n()
{ long a,x,i,t, n,m;
scanf(“%ld%ld”,&n,&m);
for( a=10;a<=200;a++)
{c=0;
for(I=1;I<=a;I++)
if( a%I==0) c++;
if(a%c==0) n++;
}
printf( nn=%d" ,n);
}
例
分析:用变量
于其真因子的和:用变量
mai n()
{ int a,I,s;
for(a=1000;a>=1;a--)
f=f1+f2,f1=f2,f2=f.
#in clude<stdio.h>
mai n()
{ long f1=1,f2=1,f, n;
for( n=3;n<=40 ;n++)
{f=f1+f2;
f1=f2; f2=f;
}
printf( nf=%ld”,f);
}
思考:求
例8:Sn=1-1/3+1/5-1/7+…1/(2n-1)求s(100)(保留4位小数)
{b=2698/a;
if(s>(a+b))
{s=a+b;
t=b;
}
}
}
printf( n“d' ,b);
}
#in clude<stdio.h>
#include“math.h”
mai n()
{double s,a=0,n;
for( n=1; n<=50 ;n++)
a=a+log( n);
s=sqrt(a);
printf( ns=%.6lf”,s);
}
例15:0<a<b,a*b=2698,且a+b最小,求b.
分析:用变量
(n%2!=0),s=s+1/(2*n-1),否则s=s-1/(2*n-1)。
#in clude<stdio.h> mai n() {int n;
float s=0;
for( n=1; *=100; n++) if(n %2!=0) s=s+1.0/(2* n-1) else s=s-1.0/(2* n-1); printf( nf.4f ” ,s);
{for(I=2;I<a;I++)
if(a%I==0) break;
if(a==I )
{b=a+2;
for(I=2;I<b;I++)
if(b%I==0) break;
if(b==I ) n++;
}
}printf( n%'d' ,n);
}
例
分析:用变量
因子的个数,
mai n()
{int a,c ,n=0,1;
5•
程序:
#in clude<stdio.h>
mai n()
{ long a,b,c,n=0;
for(c=1;c<=97;c++)
for(b=c+1;b<=98;b++) for(a=b+1;a<=99;a++)
if(a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b)
n++;
printf( n%ld”,n);
float s=0;
for(n=1; n<=30 ;n++)
{ s=s+(float)i/j;
c=i;
i=j+1; j=c+j;
}
printf( "n%f”,s);
}
此题中的n与循环体中的执行语句没有数值上的联系,仅仅用做决定循环执行的次数。
例2:下面这个程序,想想它实现的是什么功能?
#in clude<stdio.h>
}
特别注意此题中变量不能定义成
此题可做改进,在循环时确保
for(a=1;a<=99;a++)
for(b=1;b<=99;b++)
for(c=1;c<=99;c++)
if(a>b&&b>c&&a+b+c<100
&&c*c* (a*a+b*b)==a*a*b*b)
n++;
例6:e=1+1/1!+1/2!+….+1/n!(精度为1e-6)
可以不用最后察看i的值,而是通过在发现因子时改动标志变量,最后根据标志变量的值判 断是否是素数。
例5:有一个八层高的灯塔,每层所点灯数都等于上一层的两倍,一共有765盏灯,求塔底
灯数。
算法分析:
此题的关键在于塔顶的灯数,只要知道了塔顶的灯数,就可知道塔底灯数。这里采 取试探的方法来求塔顶灯数。
设塔顶灯数为x,x的初值从1开始循环,每次值加1。求出相应的灯的总数,总
mai n() {Hale Waihona Puke Baiduint i,s=0;
for(i=1;i<=100;i++)
{if(i%5==0) continue;
s=s+i;
}
printf( n“d' ,s);
}
在左边的程序中,i从1到100循环,当i是5的倍数时,直接进入下一个i,当i不是5的倍 数时,把i累加到s,最后输出s。所以,这个程序实现的是求1~100中间所有非5的倍数 的数之和。
i
程序:
#in clude<stdio.h>
mai n()
{ int a,s=0,i;
for(a=3;a<=150;a++)
{for(i=2;i<=a-1;i++)
if(a%i==O) break;
if(a==i) s=s+a;
}
printf( n“d' ,s)
}
求素数的方法很多,大同小异。此题可以做一些改动。如:i的值可以是从2取到sqrt(a);
{s=0;
for(l=1;l<a;l++)
lf(a%l==O) s=s+l;
if(a==s) break;
}
printf( n“d' ,a);
}
思考:求
例14:S=sqrt(ln(1)+ln(2) +…+ln(n)),n=50(结果保留6位小数)
分析:开平方数及自然对数都是
求得。注意函数定义的数据类型。
算法分析:
这是一道典型的三重嵌套循环的题目。a、b、c都是位于1到99之间整数。编程的基本思
路是:找出1到99之间的所有a、b、c的排列,察看同时满足a>b>c、a+b+c<100、1/a2+1/b2=1/c2这三个条件的a、b、c有多少组。值得注意的是,1/a2+1/b2=1/c2这个条件并不能简单的原
for( a=1000;a>=1;a--) {for( j=2;j<a;j++) if(a%j==0) break;
if( j==a)
{ s=s+a; I++; }
if(l==20) break;
}
printf( n“d' ,s);
}
例
分析:用变量
果
mai n()
{int a,b,n=0,1;
for(a=200;a<=998;a++)
项的分子加分母。解题思路是用循环语句求各项,并把值累加,因为是求前30项的和,循
环执行30次。
1.初值i=2,j=3,s=0;
2.用n从1到30循环
3.s=s+ i/j;
4.c=i; i=j+1; j=c+j;
5输出s;
程序:
#in clude<stdio.h>
mai n() {int i=2,j=3, n,c;
程序:
#in clude<stdio.h>
mai n()
{ int x,s,i,k;
for(x=1;;x++)
{s=0;
k=x;
for(i=1;i<=8;i++)
{s=s+k;k=k*2;}
if(s==765) break;
}
printf( n“d' ,k/2);
}例5:已知a>b>c>0,a、b、c为整数,且a+b+c<100,求满足1/a2+1/b2=1/c2的a、b、c共有 多少组?
for(a=n; a<=m;a++)
if(a%3==0)
{ x=a;
while(x>0)
{i=x%10;
if(i==5){printf (“%ld”,a);break;}
x=x/10;
}
}
}
问:能把
例
算法分析:
1.
2.
3.若a%i==0,结束i的循环,执行第4步
4.若i==a,把a累加到s上。
5.
注意:此题中执行第
样照写,因为在求分数的过程中必然有四舍五入,不能得出真正的准确的结果,必须把条件
变形成:C2(a2+b2)=a2b2才能得出正确的结果。
1.a从1到99循环
2.b从1到99循环
3.C从1到99循环
4.若a>b&&b>c&&a+b+c<100&&c*c*(a*a+b*b)==a*a*b*b,统计找到了一组
}
例9:用牛顿迭代法求方程f(x)=2x3-4x2+3x-7=0在x=2.5附近的实根,直到满足|xn-xn-1|<10-6为止。
牛顿迭代公式为:xn=xn-1-f(xn- 1)/f'-xn
算法分析:
牛顿迭代法认为,以任意一个
#in clude<stdio.h>
#in clude<math.h> mai n()
{ float x=2. 5,x0,f,f2;
do{ x0=x;
f=2*x0*x0*x0-4*x0*x0+3*x0-7;
f2=6*x0*x0-8*x0+3;
x=x0-f/f2;
}while(fabs(x-x0)>=10e-6);
printf(f %f” ,x);
}
例
分析:用变量
mai n()
{int a,s=0,I=0, j;
分析:用变量a从1至U sqrt( 2698)-1循环。变量s初值为6000。若2698%a==0,则b=2698/a,若s>a+b,则s=a+b,并保存b的值在变量t.
mai n()
{int a,b,s=6000,t;
for( a=1;a<sqrt(2698);a++)
{if(2698%a==0)
分析:用变量
环,t=t*i,e=e+1.O/t。
#in clude<stdio.h>
void mai n()
{ int i=1;
long t=1;
float e=1;
while(e-(i nt)e>=1e-6)
{ t=t*i;
e=e+1.0/t;
i++;}
printf( n“.10f”,e);
}
例7:数列1,1,2,3,5,8….有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,求f(40)。
循环结构程序设计典型例题
例1有数列2/3、4/5、6/9、10/15……求此数列前30项的和。
算法分析:
对于数列的题,首先要找出通项公式,或前后项的计算关系公式,根据公式求所需。
由于数列的题一般执行次数能确定,用for语句来编写比较方便。
此题,前后项的关系是:后一项的分子是前一项的分母加1,后一项的分母是前一
数不为765,继续下一个x的循环,直到某次求得灯总数为765时,结束x的循环,输出此
时塔底灯数。
1.x从1开始循环,每次值加1
2•设k初值x,计算每层灯数。设s初值0,累加每层灯数
3.i从1到8循环,每次值加1
4.s=s+ k; k=k*2;
5.如果s==765,结束x的循环
4. s=s+ k; k=k*2;
例3:输出n~m中(0<*m)能被3整除,且至少有一个数字是5的所有数。
算法分析:
1
2
3•
4令整型变量x=a
5•
6.i=x%10
7•
8.x=x/10,并返回第5步
9•
程序:
#in clude<stdio.h>
mai n()
{ long a,x,i,t, n,m;
scanf(“%ld%ld”,&n,&m);
for( a=10;a<=200;a++)
{c=0;
for(I=1;I<=a;I++)
if( a%I==0) c++;
if(a%c==0) n++;
}
printf( nn=%d" ,n);
}
例
分析:用变量
于其真因子的和:用变量
mai n()
{ int a,I,s;
for(a=1000;a>=1;a--)