C语言编程练习之循环结构

时间:22-10-27 网友
1.生成3的乘方表3

输入一个非负整数n,生成一张3的乘方表,输出3​0​​ ~3​n​ 的值。可调用幂函数计算3的乘方。

输入格式:

输入在一行中给出一个非负整数n。

输出格式:

按照幂的递增顺序输出n+1行,每行格式为“pow(3,i) = 3的i次幂的值”。题目保证输出数据不超过长整型整数的范围。

输入样例:

3

输出样例:

pow(3,0) = 1

pow(3,1) = 3

pow(3,2) = 9

pow(3,3) = 27

(1)编程思路。

简单的循环处理。程序中无需调用幂函数计算3的乘方。因为3n=3n-1×3。

(2)源程序。

#include

int main()

{

int i,n;

long long p=1;

scanf("%d",&n);

for (i=0;i<=n;i++)

{

printf("pow(3,%d) = %lld\n",i,p);

p=p*3;

}

return 0;

}

2.统计学生成绩

本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:

大于等于90分为A;

小于90且大于等于80为B;

小于80且大于等于70为C;

小于70且大于等于60为D;

小于60为E。

输入格式:

输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。

输出格式:

在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。

输入样例:

7

77 54 92 73 60 65 69

输出样例:

1 0 2 3 1

(1)编程思路。

简单的循环处理。

(2)源程序。

#include

int main()

{

int i,n;

scanf("%d",&n);

int score,a=0,b=0,c=0,d=0,e=0;

for (i=1;i<=n;i++)

{

scanf("%d",&score);

if (score>=90) a++;

else if (score>=80) b++;

else if (score>=70) c++;

else if (score>=60) d++;

else e++;

}

printf("%d %d %d %d %d\n",a,b,c,d,e);

return 0;

}

3.输出闰年

输出21世纪中截止某个年份以来的所有闰年年份。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。

输入格式:

输入在一行中给出21世纪的某个截止年份。

输出格式:

逐行输出满足条件的所有闰年年份,即每个年份占一行。输入若非21世纪的年份则输出"Invalid year!"。若不存在任何闰年,则输出“None”。

输入样例1:

2048

输出样例1:

2004

2008

2012

2016

2020

2024

2028

2032

2036

2040

2044

2048

输入样例2:

2000

输出样例2:

Invalid year!

(1)编程思路。

闰年的判定条件是:①能被4整除,但不能被100整除的年份都是闰年,如1996年,2004年是闰年;②能被100整除,又能被400整除的年份也是闰年。如2000年是闰年。可以用一个逻辑表达式来表示:

(year%4==0&&year%100! =0) | | year%400==0

当year为某一整数值时,如果上述表达式值为true(1),则year为闰年;否则year为非闰年。

(2)源程序。

#include

int main()

{

int endyear;

scanf("%d",&endyear);

int i,cnt=0;

if (endyear<=2000 || endyear>2100)

printf("Invalid year!\n");

else

{

for (i=2001;i<=endyear;i++)

{

if (i%4==0 && i%100!=0 || i%400==0)

{

printf("%d\n",i);

cnt++;

}

}

if (cnt==0) printf("None\n");

}

return 0;

}

4.寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。

输入格式:

输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。

输出格式:

在一行中输出第一次出现的“250”是对方扔过来的第几个数字(计数从1开始)。题目保证输出的数字在整型范围内。

输入样例:

888 666 123 -233 250 13 250 -222

输出样例:

5

(1)编程思路。

由于输入的数据个数未知,因此采用循环 while (scanf("%d",&x)!=EOF) 输入各数据。

(2)源程序。

#include

int main()

{

int ans=0,cnt=0,x;

while (scanf("%d",&x)!=EOF)

{

cnt++;

if (x==250 && ans==0) ans=cnt;

}

printf("%d\n",ans);

return 0;

}

5.最佳情侣身高差

专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。

下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。

输入格式:

输入第一行给出正整数N(≤10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。

输出格式:

对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。

输入样例:

2

M 1.75

F 1.8

输出样例:

1.61

1.96

(1)编程思路。

简单的循环处理。

(2)源程序。

#include

int main()

{

int n;

scanf("%d",&n);

for (int i=1;i<=n;i++)

{

char sex;

float height;

getchar();

scanf("%c%f",&sex,&height);

if (sex=='M')

printf("%.2f\n",height/1.09);

else

printf("%.2f\n",height*1.09);

}

return 0;

}

6.作品评分

全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。评分系统也是请程序高手设计的,能自动去掉一个最高分和一个最低分,求出平均分。

输入格式:

输入数据包括两行: 第一行为n,表示n个评委,n>2。 第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。

输出格式:

输出平均分,结果保留两位小数。

输入样例:

6

10 9 8 7.9 9 9.5

输出样例:

8.88

(1)编程思路。

定义变量min、max和sum分别保存选手的最低分、最高分和总分,先输入第1个评委的打分score,且置min=max=score,即第1个分数既是最低分,也是最高分,同时置sum=score;之后用循环依次输入第2~第n个评委的打分,对每次输入的score,累加到sum中(sum+=score),若score>max,置max=score;若score

(2)源程序。

#include

int main()

{

int n;

scanf("%d",&n);

float score,min,max,sum=0;

scanf("%f",&score);

min=max=score;

sum+=score;

for (int i=2;i<=n;i++)

{

scanf("%f",&score);

sum+=score;

if (min>score) min=score;

if (max

}

printf("%.2f\n",(sum-min-max)/(n-2));

return 0;

}

7.求平方根序列前N项和

本题要求编写程序,计算平方根序列​的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 22.47

(1)编程思路。

简单的循环累加求和。

(2)源程序。

#include

#include

int main()

{

int n;

scanf("%d",&n);

double sum=0;

for (int i=1;i<=n;i++)

{

sum+=sqrt(1.0*i);

}

printf("sum = %.2f\n",sum);

return 0;

}

8.求分数序列前N项和

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

(1)编程思路。

本题中分子和分母分别来自斐波那契数列数列的相邻两项,分子取后一项,分母取前一项。设斐波那契数列的前两项分别为y=1,x=2,用循环迭代求斐波那契前n项,在循环中执行

z=y+x; // 计算下一项的值

y=x; x=z; // 为下次迭代作准备

将前n项的x/y累加起来即得所求答案。

(2)源程序。

#include

#include

int main()

{

int n;

scanf("%d",&n);

double sum=0;

double x=2,y=1,z;

sum=x/y;

for (int i=2;i<=n;i++)

{

z=x+y;

y=x;

x=z;

sum+=x/y;

}

printf("%.2f\n",sum);

return 0;

}

9.打印九九口诀表

下面是一个完整的下三角九九口诀表:

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

(1)编程思路。

程序写成一个嵌套的二重循环,外循环i控制输出的行数(1~n),内循环j控制每行中输出i个乘法算式。

(2)源程序。

#include

int main()

{

int n;

scanf("%d",&n);

for (int i=1;i<=n;i++)

{

for (int j=1;j<=i;j++)

printf("%d*%d=%-4d",j,i,i*j);

printf("\n");

}

return 0;

}

10.统计素数并求和

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

(1)编程思路。

判断一个数m是否为素数的方法是:用2~sqrt(m)中的每一个整数i去除m,若某一个i能整除m,则m不是素数;否则,m是素数。该操作可以写成一个循环,如下:

for (i=2;i<=sqrt(1.0*m);i++)

if (m%i==0) break;

循环执行后,若i> sqrt(1.0*m),则m是素数,因为这种情况下,循环中的break语句没有被执行,即2~sqrt(m)中的每一个整数i都不能整除m。

求m~n之间的所有素数,写成一个循环,在循环中嵌套一个循环判断每个整数i是否为素数,若是,则计数并累加求和。

(2)源程序。

#include

#include

int main()

{

int m,n;

int cnt=0,sum=0;

int i,j;

scanf("%d%d",&m,&n);

if (m==1) m++;

for (i=m;i<=n;i++)

{

int t=(int)sqrt(1.0*i);

for (j=2;j<=t;j++)

if (i%j==0) break;

if (j>t)

{

cnt++;

sum+=i;

}

}

printf("%d %d\n",cnt,sum);

return 0;

}

11.输出三角形字符阵列

本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。

输入格式:

输入在一行中给出一个正整数n(1≤n<7)。

输出格式:

输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。

输入样例:

4

输出样例:

A B C D

E F G

H I

J

(1)编程思路。

程序写成一个嵌套的二重循环,外循环i控制输出的行数(1~n),内循环j控制每行中输出n+1-i个字符。

由于输出的字符从A开始,因此增加一个计数器cnt,每输出一个字符cnt加1,初始时cnt=0,这样当前输出的字符为’A’+cnt。

(2)源程序。

#include

int main()

{

int n,cnt=0;

scanf("%d",&n);

for (int i=1;i<=n;i++)

{

for (int j=1;j<=n+1-i;j++)

{

printf("%c ",'A'+cnt);

cnt++;

}

printf("\n");

}

return 0;

}

12.特殊a串数列求和

给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出。

输入样例:

2 3

输出样例:

s = 246

(1)编程思路。

aa⋯a(n个a)可以看成由n-1个a乘以10加上a得到。初始时设num=0,每次循环执行num=num*10+a。显然,第1次循环(i=1)时,num=0*10+a=a;第2次循环(i=2)时,num=a*10+a=aa;…;第n次循环(i=n)时,num= aa⋯a(n-1个a)*10+a= aa⋯a(n个a)。将每次循环得到的num累加起来就是所求答案。

(2)源程序。

#include

#include

int main()

{

int a,n,num=0,sum=0;

scanf("%d%d",&a,&n);

for (int i=1;i<=n;i++)

{

num=num*10+a;

sum+=num;

}

printf("s = %d\n",sum);

return 0;

}

13.约分最简分式

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:在scanf的格式字符串中加入/,让scanf来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。

输入样例:

66/120

输出样例:

11/20

(1)编程思路。

本题的实质是求输入的分子和分母的最大公约数。

word/media/image1.png利用转辗相除法求两个整数的最大公约数。例如,求整数m=48,n=18两个数的最大公约数的方法如下图所示。

具体做法是:,若m%n==0,则n是最大公约数,否则,计算 r=m%n,置m=n,n=r,重复这个过程,直到m%n==0。

(2)源程序。

#include

int main()

{

int m,n,r,a,b;

scanf("%d/%d",&a,&b);

m=a; n=b;

while (m%n!=0)

{

r=m%n;

m=n;

n=r;

}

printf("%d/%d\n",a/n,b/n);

return 0;

}

14.输出N以内的所有素数

编程找出N(2≤N≤500)以内(即小于等于N)的所有素数。

输入格式:

输入整数N(2≤N≤500)。

输出格式:

每8个一行输出N以内的所有素数。注意每个数据均占5列,且采用右对齐。

输入样例:

50

输出样例:

2 3 5 7 11 13 17 19

23 29 31 37 41 43 47

(1)编程思路。

判断一个数m是否为素数的方法是:用2~sqrt(m)中的每一个整数i去除m,若某一个i能整除m,则m不是素数;否则,m是素数。该操作可以写成一个循环,如下:

for (i=2;i<=sqrt(1.0*m);i++)

if (m%i==0) break;

循环执行后,若i> sqrt(1.0*m),则m是素数,因为这种情况下,循环中的break语句没有被执行,即2~sqrt(m)中的每一个整数i都不能整除m。

求2~n之间的所有素数,写成一个循环,在循环中嵌套一个循环判断每个整数i是否为素数,若是,则计数并输出,输出时每输出8个数后换行。

(2)源程序。

#include

#include

int main()

{

int n;

int cnt=0;

int i,j;

scanf("%d",&n);

for (i=2;i<=n;i++)

{

int t=(int)sqrt(1.0*i);

for (j=2;j<=t;j++)

if (i%j==0) break;

if (j>t)

{

printf("%5d",i);

cnt++;

if (cnt%8==0) printf("\n");

}

}

if (cnt%8!=0) printf("\n");

return 0;

}

15.跟奥巴马一起画方块

美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!

输入格式:

输入在一行中给出正方形边长N(3≤N≤21)和组成正方形边的某种字符C,间隔一个空格。

输出格式:

输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。

输入样例:

10 a

输出样例:

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

aaaaaaaaaa

(1)编程思路。

程序写成一个嵌套的二重循环,外循环控制输出的行数(1~(n+1)/2),内循环控制每行中删除n个字符c。

(2)源程序。

#include

int main()

{

int n;

char c;

int i,j;

scanf("%d %c",&n,&c);

for (i=1;i<=(n+1)/2;i++)

{

for (j=1;j<=n;j++)

printf("%c",c);

printf("\n");

}

return 0;

}

《C语言编程练习之循环结构-准编网.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
下载全文

《C语言编程练习之循环结构》相关文档:

C语言编程练习之循环结构10-27

练习点钞的心得体会01-26

消防演练心得体会范文_消防练习心得体会5篇02-02

《红楼梦》71-120回练习及答案02-12

《红楼梦》71-120回练习及答案剖析02-12

艺人练习生培训合同02-21

物流工程随堂练习及标准答案03-24

国际货物运输和保险练习04-27

单证练习与答案04-27

二年级下册数学思维练习补充练习105-18

下载文档

微信扫码分享

Top