前言
愚人节,出题人给大家出的题都比较友好,写的人都知道两道题出的其实是同一个知识点(求最大公约数) 所以,真的是每日一题!
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上的附加题,下次一定