每日一练

目录

1.1

1102:题目描述

          2013年起,火车票退票费比例下调:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而是以5角为单位:尾数小于0.25元的舍去、不小于0.25元且小于0.75元的计为0.5元、不小于0.75元的进为1元。

1.2 答案:

2.1

1103:题目描述

                平均学分绩点(Grade Point Average,即GPA)是以学分与绩点作为衡量学生学习的量与质的计算单位,以取得一定的学分和平均学分绩点作为毕业和获得学位的标准,实施多样的教育规格和较灵活的教学管理制度。

2.2 答案:

3.1

1104:题目描述  输入正整数n(2<=n<=1000),计算并输出n的所有正因子(包括1,不包括自身)之和。

3.2 答案:

4.1

1105:题目描述 输入两个正整数m和n,顺序输出m到n之间的所有友好数对。

4.2 答案:


1.1

1102:题目描述

2013年起,火车票退票费比例下调:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而是以5角为单位:尾数小于0.25元的舍去、不小于0.25元且小于0.75元的计为0.5元、不小于0.75元的进为1元。


编写一个函数,计算退票费,假定退票时间距离开车时间在48小时以上。函数原型如下:

double CancelFee(double price);

本题如果是C/C++代码提交,只需要提交CancelFee函数的定义部分,提交其它内容,编译出错。

输入

输入一个实数,表示火车票票面价格。

输出

输出一个实数,表示退票费,结果保留一位小数。

1.2

答案:

double CancelFee(double price)
{
	int x;
	price=price*0.05;
	x=(int)(price*100)%100;
	if(x<25)
		x=0;
	else if(x<75)
		x=50;
	else
		x=100;
	return (int)price+x*0.01;
}

完整版:

#include<stdio.h>
double CancelFee(double price);
int main()
{
	int x;
	scanf("%d",&x);
	printf("%.1lf",CancelFee(x));
	return 0;
}
double CancelFee(double price)
{
	int x;
	price=price*0.05;
	x=(int)(price*100)%100;
	if(x<25)
		x=0;
	else if(x<75)
		x=50;
	else
		x=100;
	return (int)price+x*0.01;
}

2.1

1103:题目描述

平均学分绩点(Grade Point Average,即GPA)是以学分与绩点作为衡量学生学习的量与质的计算单位,以取得一定的学分和平均学分绩点作为毕业和获得学位的标准,实施多样的教育规格和较灵活的教学管理制度。


大学里每一门课程都有一定的学分。只有通过这门课的考试,才能获得相应的学分。课程绩点的计算方法通常是:(百分制成绩-50)/10 取整。成绩100,对应绩点为5,成绩90~99对应绩点为4,......,成绩60~69对应绩点为1,成绩小于60,对应绩点为0。


平均学分绩点的计算方法是:是将学生修过的每一门课程的绩点乘以该门课程的学分,累加后再除以总学分。 平均学分绩点可以作为学生学习能力与质量的综合评价指标之一。请编程计算一个学生的平均学分绩点。


输入

输入n表示有n门课程,然后输入n门课程的学分和成绩,学分和成绩都是整数。

输出

输出平均学分绩点,保留一位小数。

2.2

答案:

#include<stdio.h>
int main()
{
	int n,x,y,a=0;
	double sum=0;
	scanf("%d",&n);
	for(n; n>=1; n--)
	{
		scanf("%d%d",&x,&y);
		sum=sum+x*fx(y);
		a=a+x;
	}
	printf("%.1lf",sum/a);
	return 0;
}
int fx(int x)
{
	if(x>=50)
		return (x-50)/10;
	else
		return 0;
}

3.1

1104:题目描述

输入正整数n(2<=n<=1000),计算并输出n的所有正因子(包括1,不包括自身)之和。


要求程序定义一个FacSum ()函数和一个main()函数,FacSum ()函数计算并返回n的所有正因子之和,其余功能在main()函数中实现。


int FacSum(int n)
{
//计算n的所有正因子(包括1,不包括自身)之和sum,本函数返回sum 
}

输入

输入正整数n(2<=n<=1000)。

输出

输出n的所有正因子(不包括自身)之和。

3.2

答案:

#include<stdio.h>
int main()
{
	int x;
	scanf("%d",&x);
	printf("%d",FacSum(x));
	return 0;
}
int FacSum(int n)
{
	int i,sum=0;
	for(i=1; i<=n/2; i++)
	{
		if(n%i==0)
			sum=sum+i;
	}
	return sum;
}

4.1

1105:题目描述

输入两个正整数m和n,顺序输出m到n之间的所有友好数对。


如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。例如:1184和1210是友好数对,因为
1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=1210
1210的因子之和为1+2+5+10+11+22+55+110+121+242+605=1184


要求程序中要定义一个facsum ()函数计算并返回n的所有正因子之和。
int facsum (int n)
{
//计算n的所有正因子之和sum,本函数返回sum
}


对于C/C++代码的提交,要求必须通过定义facsum函数来求一个整数n的正因子之和,否则,提交编译错误,本题需要提交完整的程序代码。

输入

输入两个正整数m和n,1<m<=n<=10000。

输出

输出m和n之间的所有友好数对。


在输出每个友好数对时,要求小数在前、大数在后,并去掉重复的数对。例如,220和284是一对友好数,而284和220也是一对友好数,此时只需输出220和284这对友好数。每个友好数对占一行,两数之间用空格隔开。

如果m和n之间没有友好数对,则输出“No answer”。


4.2

答案:

#include<stdio.h>
int main()
{
	int m,n,i,a,b=0;
	scanf("%d%d",&m,&n);
	for(i=m; i<=n; i++)
	{
		if(i==a)
			continue;
		if(facsum(facsum(i))==i && facsum(i)!=i)
			if(i>facsum(i))
			{
				printf("%d %d\n",facsum(i),i);
				a=i;
				b++;
			}
			else
			{

				printf("%d %d\n",i,facsum(i));
				a=facsum(i);
				b++;
			}
	}
	if(b==0)
		printf("No answer");
	return 0;
}
int facsum(int n)
{
	int i,sum=0;
	for(i=1; i<=n/2; i++)
	{
		if(n%i==0)
			sum=sum+i;
	}
	return sum;
}

ps:第一题要点:

求小数点后两位和0.25,0.75比较大小,只要提取出就可以

最后将price转化为int型,舍弃本来的小数部分(强制转化直接舍弃),加上我们新的小数。

第三题答案解析:

正因子就是大于0的因数,判断因数用取余,判断是否可以除尽(余数=0)

为了减少运算,只要循环到数字的一半就可以(除了他本身,因数<=这个数)

第四题思路:

友好数对判定方法:如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。(题目解释)


例如 a的正因数和为b,如果b的正因数和也为a,那么ab为有好数对

为了避免重复输出,用continue结束本次循环,循环到友好数对的小的数字时,跳过另一个大的友好数对

例如

a和b是有好数对,且a>b(输出时已经判定大小了)

从m循环到n,先到b判定成功,输出a和b

continue跳过b

注意:友好数对从小数到大数为一对且只有这一对,不存在交叉现象

ps:之前考虑交叉现象

为了避免新的判定成功的大数字(d)顶掉我们旧的判定的大数字(a)导致a还没起作用就被提前顶掉。

可以采用数组储存所有的大数字(a和d),循环到后面会跳过所有友好数对对应的大数字

改后如下:

#include<stdio.h>
int main()
{
	int m,n,i,a,b=0,x[99999],c,j=0,d;
	scanf("%d%d",&m,&n);
	for(i=m; i<=n; i++)
	{
		c=j;
		d=0;
		for(c; c>=0; c--)
			if(x[c]==i)
				d=1;
		if(d==1)
		continue;
		if(facsum(facsum(i))==i && facsum(i)!=i)
			if(i>facsum(i))
			{
				printf("%d %d\n",facsum(i),i);
				x[j]=i;
				j++;
				b++;
			}
			else
			{

				printf("%d %d\n",i,facsum(i));
				x[j]=facsum(i);
				j++;
				b++;
			}
	}
	if(b==0)
		printf("No answer");
	return 0;
}
int facsum(int n)
{
	int i,sum=0;
	for(i=1; i<=n/2; i++)
	{
		if(n%i==0)
			sum=sum+i;
	}
	return sum;
}

思路:

首先加个数组x控制数组的j

加个循环判定 i 是否等于所有的数组值(数组储存的为每对 有好数对 的大数字)

continue只能跳出最近的循环,也就是新建的判定循环,无法直接跳出m-n的大循环

转换思路:新增变量,新加判定就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值