C语言程序设计(第四版)—习题4程序设计题

目录

        1.求奇数和。

        2.展开式求和。

        3.求序列和。

        4.求序列和。

        5.换硬币 。

        6.输出水仙花数。

        7.求最大公约数和最小公倍数。

        8.高空坠球。

        9.打印菱形星号“ * ”图案。

        10.猴子吃桃问题。

        11.兔子繁衍问题。


        1.求奇数和。

输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程序。

输入格式:

输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

输出格式:

在一行中输出正整数序列中奇数的和。

输入样例:

8 7 4 3 70 5 6 101 -1

输出样例:

116
#include <stdio.h>
int main() {
	int n;
	int sum=0;
	scanf("%d",&n);
	while(n>0) {
		if( n%2!=0) {
			sum=sum+n;
		}
		scanf("%d",&n);
	}

	printf("%d",sum);
	return 0;
}


        2.展开式求和。

输入一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.000 01,计算结果保留4位小数。要求定义和调用函数fact(n)计算n的阶乘,可以调用pow()函数求幂。试编写相应程序。

输入格式:

输入在一行中给出一个实数x∈[0,5]。

输出格式:

在一行中输出满足条件的幂级数部分和,保留小数点后四位。

输入样例:

1.2

输出样例:

3.3201
#include<stdio.h>
#include<math.h>
double fact(int n);//求阶乘函数
int main() {
	double x;
	scanf("%lf",&x);
	int i=1;
	double sum=1,item;
	item=pow(x,i)*1.0/fact(i);//最后一项
	while(fabs(item)>=0.00001) {
		item=pow(x,i)*1.0/fact(i);
		i++;
		sum=sum+item;
	}
	printf("%.4lf",sum);
	return 0;
}
double fact(int n) {
	int i;
	double result;
	if(n<0) {
		return 0;
	}
	result=1;
	for(i=1; i<=n; i++) {
		result=result*i;
	}
	return result;
}


        3.求序列和。

输入一个正整数n,输出2/1+3/2+5/3+8/5+... 的前n项之和,保留2位小数。该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。试编写相应程序。

输入格式:

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

输出格式:

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

输入样例:

20

输出样例:

32.66
#include<stdio.h>
int main() {
	double n;
	scanf("%lf",&n);
	int i=1;
	double denominator=1.0;//分母
	double molecular=2.0;//分子
	double a=0.0;
	double sum=0;
	for(i=1; i<=n; i++) {
		sum=sum+molecular/denominator;
		a=denominator;
		denominator=molecular;
		molecular=molecular+a;
	}
	printf("%.2lf",sum);
	return 0;
}


        4.求序列和。

输入两个正整数a和n,求a+aa+aaa+aaa(n个a)之和。例如,输入2和3,输出246(2+22+222)。试编写相应程序。

输入格式:

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

输出格式:

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

输入样例:

2 3

输出样例:

s = 246
#include<stdio.h>
#include<math.h>
int main() {
	int a,n;
	scanf("%d %d",&a,&n);
	int i;
	double sum=0,item=0;
	for(i=1; i<=n; i++) {
		item=a*pow(10,(i-1))+item;
		sum=sum+item;
	}
	printf("s = %.0lf",sum);
	return 0;
}


        5.换硬币 。

将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分、1分的硬币,每种硬币至少有一枚。输入金额,问有几种换法?针对每一种换法,输出各种面额硬币的数量和硬币的总数量。试编写相应程序。

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4
#include<stdio.h>
int main()
{
	int count=0;
	int f5,f2,f1;
	int n;
	scanf("%d",&n);
	
	int i,j,k;
	for (i=n/5;i>=1;i--)
		for(j=(n-i*5)/2;j>=1;j--)
			for(k=n-i*5-j*2;k>=1;k--)
				if(i*5+j*2+k==n)
				{
					printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);
					count++;
				}
	printf("count = %d",count);
	return 0;
 } 


        6.输出水仙花数。

输入一个正整数n(3≤n≤7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。例如153的各位数字的立方和是1³+5³+3³=153。试编写相应程序。

输入格式:

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

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407
#include <stdio.h>
#include <math.h>
int main()
{
	int n;
	scanf("%d",&n);
	
	if(n==7)
	{
		printf("1741725\n4210818\n9800817\n9926315");
		return 0;
	}
	
	int i = 1*pow(10,n-1);
	int j = 1*pow(10,n);
	//printf("%d\n",j);
	for(i=1*pow(10,n-1);i<j;i++)
	{
		//printf("i=%d,j=%d\n",i,j);
		int num = 0;
		int m = i;
		while(m>0)
		{
			num = num+pow(m%10,n);
			m/=10;
		}
		//printf("m=%d i=%d,num=%d\n",m,i,num);
		if(num==i)
			printf("%d\n",i);
	}
	return 0;
}


        7.求最大公约数和最小公倍数。

输入两个正整数m和n(m≤1 000 ,n≤1 000),求其最大公约数和最小公倍数。试编写相应程序。

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

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

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044
#include <stdio.h>
int main( )
{
	int m,n;
	scanf("%d %d",&m,&n);
	
	//求最大公倍数 ->辗转相除法 
	int gcdNum = n;
	while(m%n != 0)
	{
		gcdNum = m%n;
		m = n;
		n = gcdNum;
	}
	printf("%d ",gcdNum);
	
	//最小公约数 
	//->公式: 最小公约数 = m*n/最大公倍数
	lcm = m*n/gcdNum;
	printf("%d",lcm);
	return 0;
}

 


        8.高空坠球。

皮球从height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹……如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?输出保留1位小数。试编写相应程序。

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

输入样例:

33 5

输出样例:

94.9 1.0
# include<stdio.h>
int main() {
	int i,h,n;
	double sum=0.0,l=0.0,k=2.0;
	scanf("%d %d",&h,&n);
	if(n>0) {
		sum=h;
		for(i=1; i<=n; i++) {
			sum=sum+2.0*l;
			l=h/k;
			k=k*2;
		}
	}
	printf("%0.1f %0.1f",sum,l);
	return 0;
}


        9.打印菱形星号“ * ”图案。

输入一个正整数n(n为奇数),打印一个高度为n的 “ * ” 菱形图案。例如,当n为7时,打印出以下图案。试编写相应程序。

#include <stdio.h>
#include <math.h>
int main() {
	int n;
	scanf("%d",&n);

	int i,j,k;
	
	int h=n/2 ;
	for(i=1; i<=h; i++) {//上三角 
		for(j=1; j<=(h-i)*2+2; j++)
			printf(" ");
		for(k=1; k<=2*i-1; k++)
			printf("* ");
		printf("\n");
		//printf("*\n");
	}

	for(i=0; i<=n/2; i++) {//下三角 
		for(j=i*2; j>=1; j--)
			printf(" ");
		for(k=1; k<=n-i*2; k++)
			printf("* ");
		printf("\n");
	}
	//printf("h=%d",h);
	return 0;
}

更详细的输出三角、菱形问题讲解,详见


        10.猴子吃桃问题。

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?试编写相应程序。(提示:采取逆向思维的方法,从后往前推断)

输入格式:

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

输出格式:

在一行中输出第一天共摘了多少个桃子。

输入样例:

3

输出样例:

10
#include<stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	
	int count = 1;
	int i;
	for(i=1;i<n;i++)
	{
		count=(count+1)*2;	
	}
	printf("%d",count);
	return 0;
}


        11.兔子繁衍问题。

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10000的正整数n,输出兔子总数达到n最少需要的月数。试编写相应程序。

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30

输出样例:

9
#include<stdio.h>
int main()
{
    int n,f=1,time,count=2;
    int sum=1;
    scanf("%d",&n);
    if(n==1) {
        printf("%d\n",1);
    } else {
        while(sum<n) {
            count++;
            time=f;
            f=sum;
            sum=sum+time;
        }
        printf("%d\n",count);
    }
    return 0;
}
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值