【C语言入门】笔记五 (循环结构下)

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()函数求幂

s=1+x+\frac{x^{2}}{2!}+\frac{x^{3}}{3!}+\frac{x^{4}}{4!}+...

#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的各位数字的立方和是 1^{3}+5^{3}+3^{3}=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语言程序设计》

如有错误,欢迎纠正!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值