一:分数
1.分子为0整个分数为
#include<bits/stdc++.h> using namespace std; typedef long ll; char s[10000]; ll arr,brr; ll fz,fm; void f(){ int i=0,len=strlen(s),flag=0; if(s[0]=='-') ++i,flag=1; for(;i<len;++i){ if(s[i]=='/') break; } ll a1=0,b1=0;; for(int j=(s[0]=='-'?1:0);j<i;++j){ a1=a1*10+(ll)(s[j]-'0'); } for(int j=i+1;j<len;++j){ b1=b1*10+(ll)(s[j]-'0'); } if(flag==1) arr=-a1; else arr=a1; brr=b1; } void f1(){ int i=0,len=strlen(s),flag=0;; if(s[0]=='-') ++i,flag=1;; for(;i<len;++i){ if(s[i]=='/') break; } ll a1=0,b1=0;; for(int j=(s[0]=='-'?1:0);j<i;++j){ a1=a1*10+(ll)(s[j]-'0'); } for(int j=i+1;j<len;++j){ b1=b1*10+(ll)(s[j]-'0'); } if(flag==1) fz=-a1; else fz=a1; fm=b1; } int main() { int n;scanf("%d",&n); scanf("%s",s); f1(); for(int i=2;i<=n;++i){ scanf("%s",s); f(); ll tm=fm; ll cmp=__gcd(brr,fm); fm=brr*fm/cmp; ll t1=fm/tm,t2=fm/brr; fz=t1*fz+t2*arr; ll tmp=__gcd(fz,fm); if(tmp!=1){ fz=fz/tmp;fm=fm/tmp; } } if(fz==0) cout<<0<<endl; else if(abs(fz)<fm){ cout<<fz<<"/"<<fm<<endl; } else{ ll tz=fz; if(fz<0) fz=-fz,cout<<"-"; ll c=fz%fm; ll t=fz/fm; if(c==0) cout<<t<<endl;//注意判断如果分子为0则整个数为0 else{ cout<<t<<" "; if(tz<0) cout<<"-"<<c<<"/"<<fm<<endl; else cout<<c<<"/"<<fm<<endl; } } }
2.注意分母必定不可以为0
3.求斜率时同时注意分母不得为0和斜率不存在的情况
二:杂项
1.单独的for循环一定要加花括号
2.乘两次必取模
3.string不是以'\0'为字符串的结束标志