4月1日每日‘一’题(分数)



前言

愚人节,出题人给大家出的题都比较友好,写的人都知道两道题出的其实是同一个知识点(求最大公约数) 所以,真的是每日一题!


1、简单题->约分最简公式

约分分数,实际就是求分子分母的最大公约数,一定要能熟练写出下边求最大公约数的函数。

(出题人:日系短发)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,y;
int gcd(int aa,int bb){//这个函数一定要能熟练写出,两个参数位置不用区分,即传入9 6和6 9结果相同
	if(bb==0) return aa;
	else return gcd(bb,aa%bb);
}
signed main(){
	scanf("%d/%d",&a,&b);
	y=gcd(a,b);//直接调用即可
	printf("%d/%d",a/y,b/y);
	
	return 0;
} 

2、比简单题稍难一点的简单题->N个数求和

(因为出题人是循环着,每次只有两个分数在一起通分的,通分完直接约分,并未出现数据类型int不够的情况,看群里大家的讨论好多人卡到数据类型了,也提醒一直wa现在还不知道原因的人:注意是不是数据类型没开够)

//本题思路:
//1.先求出两个分数分母的积,将两个分数通分;
//2.通分后相加成一个分数;
//3.将该分数的分子分母约分(成功转化为第一题!!)
//补充一个小学知识:两数之积/最大公约数=最小公倍数
(出题人:关山)

#include<bits/stdc++.h>
using namespace std;
int n;
int zi,mu;//第一个分数的分子分母
int zii,muu;//第二个分数的分子分母
int gcd(int a,int b){
	if(b==0) return a;
	else return gcd(b,a%b);
}
int main(){
	scanf("%d",&n);
	scanf("%d/%d",&zi,&mu);
	int ji;
	for(int i=1;i<n;i++){//循环,分数之间两两通分,相加,约分;
		scanf("%d/%d",&zii,&muu);
		//1.将两个分数进行通分
		ji=mu*muu;
		zi*=muu;
		zii*=mu;
		mu*=muu;
		muu*=mu;
		//2.将通分后的两个分数相加为一个
		zi=zi+zii;
		mu=ji;
		//3.将该分数的分子分母约分(成功转化为第一题!!)
		int chu=gcd(zi,mu);
		zi/=chu;
		mu/=chu;
	} 
	int zh=zi/mu;//该题所求的整数部分
	zi%=mu;//将整数部分提出来后,剩下的分子大小
	/*---------------------------------------------------------
	!下面细节处理很重要,好多人最后一个样例没过就是在这里wa的
	给个样例感受一下:
	   2            
	   2/3 -2/3     
	结果:0 (如果整数为0,只输出分数;分数为0,只输出整数,但是如果两个均为0,也要输出一个0)
	*/
	if(zh!=0||(zh==0&&zi==0)){
		cout<<zh;	
	}
	if(zh!=0&&zi!=0){
		cout<<" ";
	}
	if(zi!=0){
	cout<<zi<<"/"<<mu<<endl;
	}
	return 0;
} 

今天没给acwing上的附加题,下次一定
今天没给acwing上的附加题,下次一定


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值