4.5 循环结构程序设计
(循环和条件判断结构结合使用)
练习4-10
输入一个正整数n,再输入n个整数,输出最小值
#include <stdio.h>
int main(void){
int i,n,x,min;
printf("输入要输入数值的个数:");
scanf("%d",&n);
scanf("%d",&x);
min=x;
for(i=1;i<=n-1;i++){
scanf("%d",&x);
if(x<min){
min=x;
}
}
printf("最小值为:%d",min);
return 0;
}
练习4-11
输入2个正整数m和n(1<=m<=n<=500),统计并输出m和n之间的素数的个数和这些素数的和。
#include <stdio.h>
int main(void){
int i,j,m,n,count=0,cal=0;
printf("输入m:");
scanf("%d",&m);
printf("输入n:");
scanf("%d",&n);
for(i=m;i<=n;i++){
if(i==2){
count++;
cal=cal+i;
}else if(i!=1){
for(j=2;j<i;j++){
if(i%j!=0){
if(j==i-1){
count++;
cal=cal+i;
}
}else{
break;
}
}
}
}
printf("素数个数:%d,素数之和:%d",count,cal);
return 0;
}
习题4
程序设计题1
输入一批正整数(以零或者负数为结束标志),求其中的奇数和
#include <stdio.h>
int main(void){
int n,sum=0;
do{
scanf("%d",&n);
if(n>0){
if(n%2!=0){
sum=sum+n;
}
}
} while(n>0);
printf("%d",sum);
return 0;
}
程序设计题2
输入一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.00001,计算结果保留四位小数,要求定义fact(n)计算n的阶乘,可以调用pow()函数求幂
#include <stdio.h>
#include <math.h>
double fact(int n);
int main(void){
int i=1;
double s=1,x,y;
printf("x=");
scanf("%lf",&x);
do{
y=pow(x,i)/fact(i);
s+=y;
i++;
} while(fabs(y)>=0.00001);
printf("%.4f",s);
return 0;
}
double fact(int n){
int i;
double sum=1;
for(i=1;i<=n;i++){
sum*=i;
}
return sum;
}
刚开始我自定义函数fact(n)中的sum变量定义为int,结果当x=3的时候无法输出,检查了很久很久才知道sum如果为int变量,那么阶乘会产生很大的数,超过int的范围,结果导致错误...(😥真的检查了很久)
程序设计题3
输入正整数n,输出2/1+3/2+5/3+8/5+...的前n项之和,保留两位小数。该序列从第二项开始,每一项分子是前一项分子与分母的和,分母是前一项的分子。
#include <stdio.h>
int main(void){
int i,n,m1=2,m2=1,temp;
double y=0;
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++){
y=y+1.0*m1/m2;
temp=m1+m2;
m2=m1;
m1=temp;
}
printf("%.2f",y);
return 0;
}
程序设计题4
输入两个正整数a和n,求a+aa+aaa+aa...a(n个a)之和,例如输入2和3,输出246(2+22+222)
#include <stdio.h>
#include <math.h>
int main(void){
int a,n,i,j;
double m,y=0;
printf("a=");
scanf("%d",&a);
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++){
m=a;
for(j=1;j<=(i-1);j++){ //嵌套循环用来计算n个a的数值
m=m+pow(10,j)*a;
}
y=y+m;
}
printf("%.0f",y);
return 0;
}
程序设计题5
换硬币。将一笔零钱(大于8分,小于1元,精确到分)换成5分、2份和1分的硬币,每种硬币至少有一枚。输入金额,问有几种换法?针对每一种换法,输出各种面额硬币的数量和硬币总数量。
#include <stdio.h>
int main(void){
int n5,n2,n1,left,money,temp2,temp3;
printf("你的盲拧(分):");
scanf("%d",&money);
for(n5=1;n5<=money;n5++){
left=money-n5*5;
if(left>=0){
temp2=left;
for(n2=1;n2<=money;n2++){
left=temp2-n2*2;
if(left>=0){
temp3=left;
for(n1=1;n1<=money;n1++){
left=temp3-n1;
if(left==0){
printf("5分:%d枚 2分:%d枚 1分:%d枚 共%d枚硬币\n",n5,n2,n1,n5+n2+n1);
}
}
}
}
}
}
printf("Over!");
return 0;
}
程序设计题6
输入一个正整数n(3<=n<=7),输出所有的n位水仙花数,水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。例如153的各位数字的立方和是
#include <stdio.h>
#include <math.h>
int main(void){
int i,j,n,num,temp1,temp2;
printf("n=");
scanf("%d",&n);
if(n>=3&&n<=7){
for(i=pow(10,n-1);i<=pow(10,n)-1;i++){
temp1=i; //temp1存放每一次抽出后剩余的数
temp2=0; //temp2存放抽出后的计算结果
for(j=n;j>0;j--){ //将每一位数单独抽出(从最高位开始)
num=temp1/pow(10,j-1);
temp1=temp1-num*pow(10,j-1);
temp2=temp2+pow(num,n);
}
if(temp2==i){
printf("%d\n",i);
}
}
}else{
printf("n超过范围啦!");
}
return 0;
}
程序设计题7
求最大公约数和最小公倍数。输入两个正整数m和n(m<=1000,n<=1000),求其最大公约数和最小公倍数。
#include <stdio.h>
int main(void){
int i,j,m,n,num1=1,num2,max;
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
if(m>0&&m<=1000&&n>0&&n<=1000){
if(m>n){
max=m;
}else{
max=n;
}
//求最大公约数
for(i=1;i<=max;i++){
if(m%i==0&&n%i==0){
if(i>num1){
num1=i;
}
}
}
//求最小公倍数
for(j=max;j>0;j++){
if(j%m==0&&j%n==0){
num2=j;
break;
}
}
}
printf("最大公约数:%d,最小公倍数:%d",num1,num2);
return 0;
}
程序设计题8
皮球从height米的高度自由落下,触地后反弹到原高度的一半,再落下,再反弹...如此往复。请问皮球再第n次落地时,在空中共经过多少距离?第n次反弹的高度是多少?保留一位小数。
#include <stdio.h>
int main(void){
int i,n;
double height,temp,result1,result2;
printf("height=");
scanf("%lf",&height);
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++){
if(i==1){ //第一次下落不同于其他次
result1=height;
result2=height/2;
}else{
temp=height; //temp储存反弹前的高度
height/=2; //反弹后的高度
result1+=temp; //计算走过的距离
result2=height/2; //下一次反弹的高度
}
}
printf("空中经过%.1f米,第%d次反弹后高度为%.1f米",result1,n,result2);
return 0;
}
程序设计题9
打印 “ * ” 图案。输入一个正整数n(n为奇数),打印一个高度为n的 “ * ” 图案。例如,当n=7时,打印出以下图案
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include <stdio.h>
int main(void){
int n,i,j,k;
printf("n=");
scanf("%d",&n);
if(n%2!=0){
//上部分
for(i=1;i<=n;i+=2){
for(j=n-i;j>0;j--){ //填充每一行前面的空格
printf(" ");
}
for(k=1;k<=i;k++){ //填充每一行的*号
if(i-k!=0){
printf("* ");
}else{
printf("*\n");
}
}
}
//下部分
for(i=n-2;i>0;i-=2){
for(j=n-i;j>0;j--){
printf(" ");
}
for(k=1;k<=i;k++){
if(k-i!=0){
printf("* ");
}else{
printf("*\n");
}
}
}
}else{
printf("n必须为奇数!!!");
}
return 0;
}
程序设计题10
一只猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下一半加一个。到第n天早上想吃时,只剩下一个桃子了。问:第一天共摘了多少桃子?
#include <stdio.h>
int main(void){
int i,n,num=1;
printf("n=");
scanf("%d",&n);
for(i=1;i<=(n-1);i++){
num=(num+1)*2;
}
printf("共 %d 个",num);
return 0;
}
程序设计题11
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10000的正整数n,输出兔子总数至少达到n对最少需要的月数。
#include <stdio.h>
int main(void){
int n,sum,month=2,fir=1,sec=1;
printf("n=");
scanf("%d",&n);
while(sum<n){
sum=fir+sec;
fir=sec;
sec=sum;
month+=1;
}
if(n==1){
printf("至少需要1个月");
}else{
printf("至少需要%d个月",month);
}
return 0;
}
(刚看到这个题目是懵的,感觉很复杂,于是...百度一下发现兔子对数是有规律的,就是某一个月兔子的对数就是前两个月的对数相加,这样就简单很多了!解题之前可以观察数字的规律!!)
题外话
我感觉其他同学学得都挺快,不知道是他们时间用的更多还是忽略了后面的练习,又或者以前学过,觉得有点赶不上了...(*゜ー゜*)
函数章节就从下一篇笔记开始吧!
整理自书籍《C语言程序设计》
如有错误,欢迎纠正!