2021-2022-2-第2次单元练习后记

一个简单的说明

主要以记录题目,分享源码为主
顺带记录做题心路历程
太久没有做题了,手生了,难免犯一些低级错误
最后,顺便对我的后续练习起到一个规划的作用

7-1 是不是太胖了 (10 分)

题面

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)

输入格式:

输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。

输出格式:

在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。

输入样例:

169

输出样例:

124.2

C++源码

#include<cstdio>

inline int read(){
	int f=1,s=0;
	char k=getchar();
	while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
	while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
	return f*s;
}

int h;
double ans=0;
 
int main(){
	h=read();
	ans=(h-100)*1.8;
	printf("%.1f",ans);
	return 0;
}

7-2 计算火车运行时间 (10 分)

题面

本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

输入格式:

输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。

输出格式:

在一行输出该旅途所用的时间,格式为“hh:mm”,其中hh为2位小时数、mm为2位分钟数。

输入样例:

1201 1530

输出样例:

03:29

C++源码

#include<cstdio>

inline int read(){
	int f=1,s=0;
	char k=getchar();
	while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
	while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
	return f*s;
}

int a,b,h,m;
 
int main(){
	a=read(),b=read();
	h=b/100-a/100;
	m=b%100-a%100;
	if(m<0)m+=60,h-=1;
	printf("%02d:%02d",h,m);
	return 0;
}

7-3 计算存款利息 (10 分)

题面

本题目要求计算存款利息,计算公式为interest=money×(1+rate)^year−money,其中interest为存款到期时的利息(税前),money是存款金额,year是存期,rate是年利率。

输入格式:

输入在一行中顺序给出三个正实数money、year和rate,以空格分隔。

输出格式:

在一行中按“interest = 利息”的格式输出,其中利息保留两位小数。

输入样例:

1000 3 0.025

输出样例:

interest = 76.89

C++源码

#include<cstdio>
#include<cstdlib>
#include<cmath>

double m,y,r,ans;
 
int main(){
	scanf("%lf%lf%lf",&m,&y,&r);
	ans=m*pow(1+r,y)-m;
	printf("interest = %.2f",ans);
	return 0;
}

7-4 计算摄氏温度 (10 分)

题面

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式:

输入在一行中给出一个华氏温度。

输出格式:

在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:

150

输出样例:

Celsius = 65

C++源码

#include<cstdio>

inline int read(){
	int f=1,s=0;
	char k=getchar();
	while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
	while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
	return f*s;
}

int a,ans;
 
int main(){
	a=read();
	ans=5*(a-32)/9;
	printf("Celsius = %d",ans);
	return 0;
}

7-5 打折 (10 分)

题面

去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。

输入格式:

输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。

输出格式:

在一行中输出商品的折扣价,保留小数点后 2 位。

输入样例:

988 7

输出样例:

691.60

C++源码

#include<cstdio>

double a,b,ans;

int main(){
	scanf("%lf%lf",&a,&b);
	ans=a*b/10;
	printf("%.2f",ans);
	return 0;
}

7-6 N个数求和 (20 分)

题面

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

C++源码

#include<cstdio>
#include<cmath>
#define MAXN 102
#define Max(a,b) (a>b?a:b)

long long gcds(long long x,long long y){
	if(y)
		return gcds(y, x%y);		
    else			
        return x;
} 
long long ins[MAXN][2],cou[MAXN][2],n,ansu,ansd,gc,in;

int main(){
	gc=in=ansu=ansd=0;
	scanf("%lld",&n);
	for(int i=1;i<=n;++i)scanf("%lld/%lld",&ins[i][0],&ins[i][1]),cou[i][0]=ins[i][0],cou[i][1]=ins[i][1];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			 if(i!=j&&ins[j][0]!=0&&ins[j][1]!=0&&ins[i][0]!=0&&ins[i][1]!=0)cou[i][0]*=ins[j][1],cou[i][1]*=ins[j][1];
	for(int i=1;i<=n;++i)if(cou[i][0]!=0)ansd=Max(cou[i][1],ansd);
	for(int i=1;i<=n;++i)if(cou[i][1]!=0)ansu+=cou[i][0];
	if(ansu<0)gc=gcds(-ansu,ansd);
	if(ansu>0)gc=gcds(ansu,ansd);
	if(gc!=1&&gc!=0)ansu/=gc,ansd/=gc;
	if(ansu!=0&&ansd!=0&&abs(ansu/ansd)>=1){
		in=ansu/ansd;
		ansu-=(ansd*in);
	}
	if(ansd<0)ansd*=-1,ansu*=-1;
	if(ansu==0&&in==0)putchar('0');
	else if(ansu==0&&in!=0)printf("%d",in);
	else if(in==0&&ansu!=0)printf("%d/%d",ansu,ansd);
	else if(in!=0&&ansu!=0)printf("%d %d/%d",in,ansu,ansd);
	return 0;
}

源码注释

累乘得一个可能是假分数的分数,然后通过求gcd(辗转相除法求最大公约数),即可得

本次练习的反思

当日我早上想要赶紧做完碎觉,结果最后一题调了一小时没调出来。原因最后发现是gcd函数写错了,试图用^=语句交换a,b并完成相除,最后发现想炫技把自己坑了,但凡用了_gcd()都能早早解决。
一是我过度自信了,对于自己写的代码,不完全理解的,纯粹只剩下肌肉记忆的代码过于深信不疑。由此也看出我的算法理解在下降。
二是说白了缺少练习,码力下降了。同时我也有点飘,说实话,对于不确定的东西为了炫技或者其他原因,强行去用,增加了程序的不稳定性。

关于源码中read()函数的说明

read()函数为自行定义的一个快速读入整数的函数,不熟悉快读的朋友可以自行改为scanf()语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值