浙大版《C语言程序设计(第3版)》题目集(编程题q41-q50)

浙大版《C语言程序设计(第3版)》题目集(编程题q41-q50)
习题4-5 换硬币 (20分)
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

#include "stdio.h"
int main()
{
	int x;
	int fen5=0,fen2=0,fen1=0;
    int total =0,count=0;
    scanf("%d",&x);
    for(int k=x/5; k>0; k--){
    	for(int j=x/2;j>0;j--){
    		for(int i=x;i>0;i--){
    			if(i+2*j+5*k==x){
    				count++;
    				total=i+j+k;
    				printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",k,j,i,total);
				}
			}
		}
	}
	printf("count = %d",count);
	return 0;
}

习题4-6 水仙花数 (20分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 本题要求编写程序,计算所有N位水仙花数。

#include "stdio.h"
#include "math.h"
int main()
{
	int N,min,max;
	int i,a,b;
	int item,sum=0;
	scanf("%d",&N);
	min=pow(10,N-1);
	max=pow(10,N)-1;
	for(i=min;i<=max;i++){
		a=i;
		sum=0;
		while(a>0){
			b=a%10;  //取末位
			a/=10;
			item=pow(b,N);
			sum+=item;
		}
		if(sum==i){
			printf("%d\n",i);
		}
	}
	return 0;
	
}
在这里插入代码片

习题4-7 最大公约数和最小公倍数 (15分)
本题要求两个给定正整数的最大公约数和最小公倍数。

#include "stdio.h"
int main()
{
	int a,b,c,m,n;
	scanf("%d %d",&m,&n);
	if(m<n){    //使用辗转相除法要保证m>n 
		c=m;
		m=n;
		n=c;
	}
	a=m;
	b=n;
	while(b!=0){
		c=a%b;
		a=b;
		b=c;
	}
	printf("%d %d",a,m*n/a);  //最小公倍数=两数乘积/最大公约数 
	return 0;
}

习题4-8 高空坠球 (20分)
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

#include "stdio.h"
int main()
{
	int n=0,cnt=0;
	double sum=0,h=0;
	scanf("%lf %d",&h,&n);  //初始高度,n 
	while(h!=0&&cnt<n){
		sum+=h;
		cnt++;
		h=h/2;
		sum+=h;   //距离为下落高度和反弹高度(反弹高度为下落高度一半) 
	}
	if(n==0){
		sum=0;
		h=0;
	}else{
		sum=sum-h;  //落地时的距离不包括反弹 
	}
	printf("%0.1f %0.1f",sum,h);
	return 0;
	
}

习题4-9 打印菱形图案 (15分)
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

#include "stdio.h"
int main()
{
	int n;
	scanf("%d",&n);
    int mid=(n/2)+1;  //打印菱形即为打印两个三角形,先找到中间线 
    for(int i=1;i<=mid;i++){
    	for(int j=mid-i;j>0;j--){
    		printf("  ");   //输出空格 
		}
		for(int k=0;k<(2*i-1);k++){
			printf("* ");   //输出*号 
		}
		printf("\n");     //一行输完后回车 
	}
	for(int i=1;i<mid;i++){
		for(int j=0;j<i;j++){
			printf("  ");
		}
		for(int k=(mid-i)*2-1;k>0;k--){
			printf("* ");
		}
		printf("\n");
	}
	return 0;
}

习题4-10 猴子吃桃问题 (15分)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

#include "stdio.h"
int main()
{
	int N;
	int num=1;   //倒着考虑,最后一天还是1个 
	scanf("%d",&N);
	for(int i=1;i<=N-1;i++){  //从最后一天到第二天循环 
		num=(num+1)*2;
	}
	printf("%d",num);
	return 0;
}

习题4-11 兔子繁衍问题 (15分)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

#include"stdio.h"
int main()
{
	int N;
	scanf("%d",&N);
	if(N==1){     
		printf("1");
	}
	else{
		int i,x1,x2,x;
		x1=1,x2=1,x=0;
		for(i=2;x2<N;i++){   //斐波那契数列问题 
			x=x1+x2;
			x1=x2;
			x2=x;
		}
		printf("%d",i);
	}
	return 0;
	
 } 

习题6-7 简单计算器 (20分)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

#include "stdio.h"
int main()
{
	int i,sum,isnan=0;
	char op='0';
	scanf("%d",&sum);
	while(op!='='){
		scanf("%c",&op);
		if(op=='='){
			break;
		}
		scanf("%d",&i);
		if(op=='+'){
			sum=sum+i;
		}else if(op=='-'){
			sum=sum-i;
		}else if(op=='*'){
			sum=sum*i;
		}else if(op=='/'){
			if(i!=0) {
				sum=sum/i;
			}
			else{
				isnan=1;
			}	
		}
		else{
			isnan=1;
		}
	}
	if(isnan==1){
		printf("ERROR");
	}
	else
	    printf("%d\n",sum);
	return 0;
}

习题6-8 统计一行文本的单词个数 (15分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

#include "stdio.h"
int main()
{
	char str;
	int cnt=0,flag=0;
	str=getchar();
	while(str!='\n'){
		if(str!=' ')
		   flag=1;
		if(flag==1&&str==' '){
			cnt++;
			flag=0; 
		} 
		str=getchar();
	}
	if(flag==1)
	   cnt++;
    printf("%d",cnt);
	return 0;
	
}

练习7-2 求最大值及其下标 (20分)
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

#include "stdio.h"
int main()
{
	int n;
	int a[10];    //(n<=10)
	scanf("%d",&n);
	for (int i =0;i<n;i++ ){
		scanf("%d",&a[i]);
	}
	int max=0;     //令最大值为0 
	for(int j=1;j<n;j++){
		if(a[j]>a[max]){
			max=j;
		}
	}
	printf("%d %d",a[max],max);
	return 0;
}

你可能感兴趣的:(C语言)