typedef struct FRAC
{
long long numr;
long long dnmt;
}frac;
frac myfrac[100];
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
void simple(long long a,long long b)
{
long long aa=a,bb=b;
long long bcf=gcd(aa,bb);
(a)=aa/bcf,(b)=bb/bcf;
}
frac FracSimple(frac in)
{
simple(&in.numr,&in.dnmt);
int tag=1;
if(in.numr==0)tag=0;
else if( (( in.numr/longabs(in.numr)) * (in.dnmt/longabs(in.dnmt))) <0) tag=-1;
return (frac){longabs(in.numr)*tag,longabs(in.dnmt) };
}
using namespace std;
long long int gcd(long long int a,long long int b)
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
void solve()
{
int num;
cin>>num;
char s[81];
long long int a[31];
long long int b[31];
scanf(“%s”,s);
int l=strlen(s);
long long int numup=0;
long long int numdown=0;
long long int suan=0;
long long int gcdn=0;
int sqr=1;
int k=0;
for(int i=0;i=‘0’&&s[i]<=‘9’) suan=suan10+s[i]-‘0’;
if(s[i]==’/’&&suan!=0) {
a[k]=suansqr;
suan=0;
sqr=1;
//cout<<i<<ends<<k<<ends<<a[k]<<endl;
}
if(s[i]==’-‘){
sqr=-1;
if(suan!=0)
{b[k]=suan;
//cout<<i<<ends<<k<<ends<<b[k]<<endl;
suan=0;
k++;}
终于过了!!!
坑死我了!!!最后还是问了老师才知道错哪里[em:07]
字符串可能以“+”开头!我一直以为没有人会没事干开头还放个加号的[em:15]
很考验耐心…嗯…
写了个分数模板,大家看看。
include
using namespace std;
define LL long long
int T;
struct fraction
{
LL up,down;
LL gcd(LL aa,LL bb)
{
aa=abs(aa);bb=abs(bb);
if(aa<bb) swap(aa,bb);
if(bb==0) return aa;
else return gcd(bb,aa%bb);
}
void reduction()
{
if(up==0)
{
down=1;
return;
}
LL GCD=gcd(up,down);
up/=GCD;down/=GCD;
return;
}
fraction(LL aa,LL bb=1)
{
up=aa;down=bb;
(*this).reduction();
}
void print()
{
if(down==1) printf(“%lld\n”,up);
else printf(“%lld/%lld\n”,up,down);
}
};
fraction operator+(const fraction& aa,const fraction& bb)
{
fraction ret(aa.upbb.down+bb.upaa.down,aa.down*bb.down);
ret.reduction();
return ret;
}
/fraction operator-(const fraction& aa,const fraction& bb)
{
fraction ret(aa.upbb.down-bb.upaa.down,aa.downbb.down);
ret.reduction();
return ret;
}*/
void solve()
{
int useless;
cin>>useless;
string line;
cin>>line;
int pos=0,ll=line.length();
fraction ans(0);
while(pos<ll)
{
LL a,b;
int symbol=1;
if(line[pos]==’+’) pos++;
if(line[pos]==’-‘) {symbol=-1;pos++;}
LL num=0;
while(pos<ll && isdigit(line[pos]))
{
num=num10+line[pos]-‘0’;
pos++;
}
a=numsymbol;
pos++;
}
ans.print();
return;
}
int main()
{
scanf(“%d”,&T);
for(int step=0;step<T;step++)
{
printf(“case #%d:\n”,step);
solve();
}
return 0;
}
分数计算和多项式计算是字符串绕不过去的坎。
注意,分母有可能带符号,这时要把负号给分子。
附C代码:
Hints:相加时不要写的太粗犷,会哇到怀疑人生的!(用了高精度就是另一回事了)QwQ
分数计算有些细节…
1.处理输入:可以用简单的scanf(“%d/%d”,&a,&b),//scanf对于%d是可以处理’+‘号的..
2.计算:两个分数处理得到结果与下一个计算,然后重复上述过程;注意每次得到的分数值都需要”a.约分 b.将符号提到分子”
3.输出:在计算中每次得到的值都完成了提符号和化简。直接查看分母,为1时输出分子,不为1则输出numerator/denominator
4.分数化简代码:
define longabs(a) (a>0? a : (-a))
typedef struct FRAC
{
long long numr;
long long dnmt;
}frac;
frac myfrac[100];
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
void simple(long long a,long long b)
{
long long aa=a,bb=b;
long long bcf=gcd(aa,bb);
(a)=aa/bcf,(b)=bb/bcf;
}
frac FracSimple(frac in)
{
simple(&in.numr,&in.dnmt);
int tag=1;
if(in.numr==0)tag=0;
else if( (( in.numr/longabs(in.numr)) * (in.dnmt/longabs(in.dnmt))) <0) tag=-1;
return (frac){longabs(in.numr)*tag,longabs(in.dnmt) };
}
又是字符串类的题……难度比那鬼符号方程好多了……
还是c++ string大法好
再来一波毒瘤代码,几乎就是C实现了
include
using namespace std;
long long int gcd(long long int a,long long int b)
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
void solve()
{
int num;
cin>>num;
char s[81];
long long int a[31];
long long int b[31];
scanf(“%s”,s);
int l=strlen(s);
long long int numup=0;
long long int numdown=0;
long long int suan=0;
long long int gcdn=0;
int sqr=1;
int k=0;
for(int i=0;i=‘0’&&s[i]<=‘9’) suan=suan10+s[i]-‘0’;
if(s[i]==’/’&&suan!=0) {
a[k]=suansqr;
suan=0;
sqr=1;
//cout<<i<<ends<<k<<ends<<a[k]<<endl;
}
if(s[i]==’-‘){
sqr=-1;
if(suan!=0)
{b[k]=suan;
//cout<<i<<ends<<k<<ends<<b[k]<<endl;
suan=0;
k++;}
else cout<<numup<<”/”<<numdown<>T;
for(int i=0;i<T;i++)
{
printf(“case #%d:\n”,i);
solve();
}
}