浙江大学 PTA 程序 第四部分 给定精度的简单交错序列部分和 数字游戏 e的近似值 最小值 统计素数并求和 奇数和 幂级数展开的部分和 分数序列前N项和 特殊a串数列求和 换硬币 水仙花数 最大公约

练习4-3 求给定精度的简单交错序列部分和 (15 分)

本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

输入格式:

输入在一行中给出一个正实数eps。

输出格式:

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

输入样例1:

4E-2

输出样例1:

sum = 0.854457

输入样例2:

0.02

输出样例2:

sum = 0.826310
#include "stdio.h"
main()
{
	double sum=0.0,sn=1.0,eps,i,flag=-1;
	scanf("%lf",&eps);
	for(i=1;sn>eps;i++)
	{
		flag*=-1;//符号转换
		sn=1/(i*3-2);//各项绝对值计算
		sum+=sn*flag;//求和		
	}
	printf("sum = %lf\n",sum);//输出	 
} 

练习4-6 猜数字游戏 (15 分)

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:

输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:

在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:

58 4
70
50
56
58
60
-2

输出样例:

Too big
Too small
Too small
Good Guess!
#include "stdio.h"
int main()
{
    int count=0,a,b,N;
    scanf("%d %d", &a, &N);//随机给出被猜数字和最大猜测次数 
    //开始循环猜测 
	for(;count<=N;) 
	{
		 
		count++;//次数计数
		if(count>N) {printf("Game Over\n");break;}//超过次数退出程序,否则输入猜测数字 
		scanf("%d",&b);//输入猜测的数字
		//判断猜数字情况 
		if(b<0) { printf("Game Over\n");break;	}
		else if(b>a) printf("Too big\n");
		else if(b<a) printf("Too small\n");	
		else if(b==a)
			{
				if(count==1){printf("Bingo!\n");break;}
				else if(count<=N){printf("Good Guess!\n");break;}
			}
	}
	
	return 0;		 
} 

 

拓展应用:随机数由计算机生成,用户自定义猜游戏次数(难度控制),每次用户输入1个数据,程序给出相对于随机数的大小提示,给出猜数字游戏的结果。

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h" 
void win_contr()
{
		/*
        颜色属性由两个十六进制数字指定, 第一个为背景色, 第二个为前景色。
        每个数字可以为下列值之一:
        黑色 = 0      蓝色 = 1      绿色 = 2      湖蓝色 = 3
        红色 = 4      紫色 = 5      黄色 = 6      白色 = 7
        灰色 = 8      淡蓝色=9      淡绿色=A      白色=C
        淡紫色=D      淡黄色=E      亮白色=F
    */
    //设置背景色为灰色,文字颜色为淡黄色
    system("color 47");
    //设置窗口大小,cols 宽度  lines 高度 
	system("mode con cols=30 lines=20");
}
main()
{	
	win_contr();
	int count=0,a,b,i,N;
	printf("请输入最大猜游戏次数:");//次数越小难度越大 
	scanf("%d",&N);//给出最大猜游戏次数 
	srand((unsigned)time(NULL));//生成时间种子 
	a=rand()%100+1;//生成1-100随机正整数 
	//printf("%d %d\n",a,N);//查看生成的随机数和最大猜游戏次数 
	printf("\nGame begin!\n");//猜游戏开始 
    printf("\n请输入1-100的正整数!\n\n");//猜游戏开始
	for(;count<=N;)
	{
		count++;//次数计数
		if(count>N) //超过次数退出程序,否则输入猜测数字
        {
            printf("Game Over\n");
            printf("The Aanswer is :%d\n\n",a);//查看结果 
            break;
        } 
		scanf("%d",&b);//输入猜测的数字
		//判断猜数字情况 
		if(b<0) { 
			printf("Game Over\n");
			printf("The Aanswer is :%d\n\n",a);//查看结果 
			break;}
		else if(b>a) printf("Too big\n");
		else if(b<a) printf("Too small\n");	
		else if(b==a)
			{
				if(count==1){printf("Bingo!\n");break;}
				else if(count<=N){printf("Good Guess!\n");break;}
			}
	}
	system("pause\n");
	printf("\n\t【】任意键继续\n\t【e】退出\n");
	fflush(stdin);
	char c=getchar();
	//fflush(stdin);
	if(c=='e') 
		return 0;
	else
		main() ;		 
} 

练习4-7 求e的近似值 (15 分)

自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求对给定的非负整数n,求该级数的前n项和。

输入格式:

输入第一行中给出非负整数n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180
#include "stdio.h"
int main()
{
	int n,i,j;
	double sum=1.0,k;  //sum作为求和结果,初值为1.0,k为第j项的阶乘 
	scanf("%d",&n);	   //输入数据 
	printf("\n");
	for(i=1;i<=n;i++)  //循环求和 
		{
			k=1.0;
			for(j=1;j<=i;j++) //循环求阶乘 
			k=(double)j*k;
			//printf("i = %d j = %d k = %.0lf  ",i,j,k);//验证阶乘 
			sum+=1.0/k;
			//printf("sum = %.8lf\n",sum);//验证求和
		}
	printf("%.8lf\n",sum);	//输出结果 ,8位小数 
}

练习4-10 找出最小值 (20 分)

本题要求编写程序,找出给定一系列整数中的最小值。

输入格式:

输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

输出格式:

在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

输入样例:

4 -2 -123 100 0

输出样例:

min = -123
#include "stdio.h"
int main()
{
	int i,n,min,a[n];
	scanf("%d",&n);	   //输入数据 n
	for(i=0;i<n;i++)  //循环输入,存入数组 
		scanf("%d",&a[i]);
	min=a[0];     //假设第一个数值最小 
	for(i=1;i<n;i++) //循环比较a[i]和 min 将小值赋给min 
		if(min>a[i]) min=a[i];
	printf("min = %d\n",min);	//输出结果 
}

练习4-11 统计素数并求和 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

10 31

输出样例:

7 143
#include "stdio.h"
#include "math.h"
int main()
{
	int m,n,i,j,count=0,sum=0;
	scanf("%d%d",&m,&n);	   //输入数据 m,n
	if(m>n||m<=0||n<=0||n>500) return 0; //判断给出数据是否满足题目要求 
	else
	{
		for(i=m;i<=n;i++)  //循环 m->n 间所有整数
			{
				for(j=2;j<=sqrt(i);j++) // 判断是否为素数 
				if(i%j==0)break;		// 满足条件不是素数 
				if(j>sqrt(i)){count++; sum+=i;} //是素数,计数、求和 
			}
	}
	printf("%d %d\n",count,sum);	//输出结果 
	return 0;
}

习题4-1 求奇数和 (15 分)

本题要求计算给定的一系列正整数中奇数的和。

输入格式:

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

输出格式:

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

输入样例:

8 7 4 3 70 5 6 101 -1

输出样例:

116
#include "stdio.h"
int main()
{
	int n,sum=0;
	scanf("%d",&n);	   //输入数据 n
	while(n>0)  //输入数据大于 0 
	{
		if(n%2)	sum+=n; //为奇数 则求和 
		scanf("%d",&n); //输入下一个数据 
	}
	printf("%d\n",sum);	//输出结果 
	return 0;
}

习题4-2 求幂级数展开的部分和 (20 分)

已知函数e​x​​可以展开为幂级数1+x+x​2​​/2!+x​3​​/3!+⋯+x​k​​/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求e​x​​的近似值,求和一直继续到最后一项的绝对值小于0.00001。

输入格式:

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

输出格式:

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

输入样例:

1.2

输出样例:

3.3201
#include "stdio.h"
#include "math.h"
int main()
{
	int i,j;
	double x,eps,sum=1.0,jiecheng;
	scanf("%lf",&x); //输入数据 x
	eps=x;	  		 //输eps作为精度值,初值为 x; 
	for(i=1;eps>=0.00001;i++)//设置循环,eps<0.00001 时结束 
	{
		jiecheng=1.0;       //阶乘初值  
		for(j=1;j<=i;j++)  //计算分母 阶乘 
	 			jiecheng*=(double)j;
		eps=pow(x,(double)i)/jiecheng;  // i次幂用函数pow(x,i) 
		sum+=eps;		//求和 
	}
	printf("%.4lf\n",sum);	//输出结果 
	return 0;
}

习题4-3 求分数序列前N项和 (15 分)

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

输入格式:

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

输出格式:

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

输入样例:

20

输出样例:

32.66
#include "stdio.h"
int main()
{
	int i,x,y,n,t;
	double sum=0.0;
	scanf("%d",&n); //输入数据 n
	for(i=1;i<=n;i++)//设置循环
	{
		if(i==1){x=2;y=1;}     // 计算第 i 项的分子、分母 
		else {t=x+y;y=x;x=t;}
		sum+=(double)x/y;		//求和 
	}
	printf("%.2lf\n",sum);	//输出结果 
	return 0;
}

习题4-4 特殊a串数列求和 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

2 3

输出样例:

s = 246
#include "stdio.h"
int main()
{
	int i,a,n;
	double sum=0.0,res=0.0;
	scanf("%d%d",&a,&n); //输入数据 a,n
	for(i=0;i<n;i++)//设置循环
		{	sum=sum*10+a;  //求每一项 
			res+=sum;   //求和 
		}	  
	printf("%.0lf\n",res);	//输出结果 
	return 0;
}

习题4-5 换硬币 (20 分)

将一笔零钱换成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 i,j,k,n,count=0;
	scanf("%d",&n); //输入数据 n
	for(i=n/5;i>0;i--)//设置循环 fen5
		for(j=n/2;j>0;j--)//设置循环 fen2
			for(k=n;k>0;k--)//设置循环 fen1
			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\n",count);	 
	return 0;
}

数量从小到大输出

#include "stdio.h"
int main()
{
	int i,j,k,n,count=0;
	scanf("%d",&n); //输入数据 n
	for(i=1;i<=n/5;i++)//设置循环 fen5
		for(j=1;j<=n/2;j++)//设置循环 fen2
			for(k=1;k<=n;k++)//设置循环 fen1
			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\n",count);	 
	return 0;
}

习题4-6 水仙花数 (20 分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

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

输出格式:

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

输入样例:

3

输出样例:

153
370
371
407
#include "stdio.h"
#include "math.h"
int main()
{
	int j,n;
	double i,k,m,sum,res;
	scanf("%d",&n); //输入数据 n
	sum=pow(10,n-1); //N位数 初始值 例 3位数 初值100,肯定不是水仙数 
	for(i=sum+1;i<sum*10;i++) //N位数 最大值 初值 sum*10-1 
		{
			m=i;     //用于求每位数值
			res=0.0; //记录每位数字的N次幂的和  
			for(j=0;j<=n;j++) 
			{
				k=(int)m%10;
				m/=10;
				res+=pow(k,n);
			}
			if(i==res)printf("%.0lf\n",i); //满足条件则为水仙数,输出结果 
		}	 
	return 0;
}

习题4-7 最大公约数和最小公倍数 (15 分)

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

输入格式:

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

输出格式:

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

输入样例:

511 292

输出样例:

73 2044
#include "stdio.h"
#include "math.h"
int main()
{
	int i,m,n,t,maxg,minb,flag=0;//flag用于确定是否已经取得最大公约数 
	scanf("%d%d",&m,&n); //输入数据 m,n
	t=m>n?n:m; //两数中的小数赋值给 t ,用于确定循环终点 
	minb=m*n;  //假设两数没有公约数,最小公倍数为两数乘积 
	for(i=t;i>=sqrt(t);i--) //N位数 最大值 初值 sum*10-1 {
			if(m%i==0&&n%i==0) 				
				if(flag==0){maxg=i;flag++;} //取得最大公约数后,不再赋值给 maxg 
			minb/=maxg; //最小公倍数 即为 两数乘积除最大公约数 
	printf("%d %d\n",maxg,minb); //输出结果 	 
	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值