分数的四则运算(算法笔记)
题目描述: 第一行输入分数的个数,第二行输入分数,输出其和,用分数表示(输入都为正数)。
题目分析: 按照平时分数加法运算,求分母的最小公倍数,再将分子相加。
知识储备:
1)最大公约数求解:辗转相除法。大数除以小数得到余数,再用小数除以余数,直到余数为0,该式的被除数即为最大公约数。比如求解27和36的最大公约数:
36 ÷ 27 = 1…9;
27 ÷ 9 = 4…0;(9为最大公约数)
2)两数的乘积 = 最大公约数 × 最小公倍数。
3)如何在设置里使用C++ 11新特性:
4)string类常用函数:
string str;
str.substr(2); // 提取下标2到末尾
str.substr(2,4); // 提取下标2开始,提取4个字符
str.find(‘a’); // 查找a,返回其位置;查找失败返回-1
str.find(‘a’,1); // 从位置1处查找a
(还有很多,到时整理写一篇)
5)字符串转数字:stoi(str,0,10) 将str从0开始到末尾转为十进制。
结果截图:
代码如下:
#include<iostream>
#include<string> //字符串
using namespace std;
const int maxn=100;
// 求2数最小公倍数(两种方法):两数乘积=最大公约数(辗转相除法)×最小公倍数
int cmul(int a,int b){
int temp,y;
int c1=a,c2=b;
if(a>b){ //保证a比b小
temp=a;
a=b;
b=temp;
}
while(b%a!=0){
y=b%a;
b=a;
a=y;
}
if(y==0){ //y为最大公约数
y=a;
}else{
y=y;
}
return c1*c2/y;
}
int main(){
int n,sum=0,i=0;
cin>>n;
string arr[n];//用二维数组存储输入的分数
while(i<n){ // 输入要计算的分数
cin>>arr[i];
i++;
}
int brr[n],index=0,crr[n]; //将分母放一个数组brr,分子放一个数组crr
char c='/';
string sub1,sub2;
for(int k=0;k<n;k++){
index=arr[k].find(c,index); //找到‘/’所在位置
sub1=arr[k].substr(index+1); // 截取字符后得到sub
sub2=arr[k].substr(0,arr[k].length()-index-1);
brr[k]=stoi(sub1,0,10); //字符串转数字
crr[k]=stoi(sub2,0,10);
}
//找brr里的最小公倍数t:先求前两个数,再求前2个数和第三个数
int t=brr[0];
for(int k=0;k<n-1;k++){
t=cmul(t,brr[k+1]);
}
for(int k=0;k<n;k++){
crr[k]=t/brr[k]*crr[k];
sum=sum+crr[k];
}
cout<<sum<<'/'<<t;
return 0;
}