本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。
输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。
输出格式:
在一行中打印出A−B的结果字符串。
输入样例:
I love GPLT! It's a fun game!
aeiou
输出样例:
I lv GPLT! It's fn gm!
#include<bits/stdc++.h>
#define ll long long
using namespace std;
class Stu{
public:
ll a;
ll b;
};
// 求最小公倍数
int lcm(int a, int b){
return a * b / __gcd(a, b);
}
int main(){
int n;
cin>>n;
ll arr[n],brr[n];
for(int i=0;i<n;i++){
string s;
cin>>s;
int index = s.find("/");
ll a = 0;
ll b = 0;
if(s[0]=='-'){
for(int i=1;i<index;i++) a = a * 10 + (s[i]-'0');
a = a * (-1);
}else{
for(int i=0;i<index;i++) a = a * 10 + (s[i]-'0');
}
for(int i=(index+1);i<s.size();i++) b = b * 10 + (s[i]-'0');
Stu* stu = new Stu();
arr[i] = a;
brr[i] = b;
}
ll x = 1;
for(ll i=0;i<n;i++){
x = lcm(x,brr[i]);
}
ll sumz = 0;
ll summ = 0;
for(int i=0;i<n;i++){
ll b = x / brr[i];
arr[i] *= b;
brr[i] *= b;
sumz += arr[i];
summ = brr[i];
}
ll y = __gcd(summ,sumz);
if(y==0){
return 0;
}
sumz /= y;
summ /= y;
if(sumz % summ == 0){
cout<<sumz/summ;
}else if(summ > sumz){
cout<<sumz<<"/"<<summ;
}else {
ll z = sumz / summ;
ll d = sumz % summ;
cout<<z<<" ";
cout<<d<<"/"<<summ;
}
}