大整数的运算
#include<iostream>
#include<string>
using namespace std;
struct Bn
{
int len;
int n[101];
Bn()
{
len=0;
}
};
Bn toBn(string s)
{
Bn ans;
int len=s.length();
for(int i=0;i<len;i++)
{
ans.n[i]=s[len-i-1]-'0';
ans.len++;
}
return ans;
}
Bn add(Bn b1,Bn b2)
{
Bn ans;
int len=b1.len>b2.len?b1.len:b2.len;
ans.len=len;
int carry=0;
for(int i=0;i<len;i++)
{
int temp=b1.n[i]+b2.n[i]+carry;
ans.n[i]=temp%10;
carry=temp/10;
}
if(carry!=0)
ans.n[ans.len++]=carry;
return ans;
}
Bn sub(Bn b1,Bn b2)
{
Bn ans;
int len=b1.len>b2.len?b1.len:b2.len;
ans.len=len;
for(int i=0;i<len;i++)
{
if(b1.n[i]<b2.n[i])
{
b1.n[i]+=10;
b1.n[i+1]--;
}
ans.n[i]=b1.n[i]-b2.n[i];
}
while(ans.len>1&&ans.n[ans.len-1]==0)
ans.len--;
return ans;
}
Bn multiply(Bn a,int b)
{
Bn ans;
ans.len=a.len;
int carry=0;
for(int i=0;i<a.len;i++)
{
int temp=a.n[i]*b+carry;
ans.n[i]=temp%10;
carry=temp/10;
}
while(carry!=0)
{
ans.n[ans.len++]=carry%10;
carry/=10;
}
return ans;
}
Bn divide(Bn a,int b)
{
Bn ans;
ans.len=a.len;
int r=0;
for(int i=a.len-1;i>=0;i--)
{
int temp=r*10+a.n[i];
ans.n[i]=temp/b;
r=temp%b;
}
while(ans.len>1&&ans.n[ans.len-1]==0)
ans.len--;
return ans;
}
void print(Bn b)
{
for(int i=b.len-1;i>=0;i--)
cout<<b.n[i];
}
int main()
{
string s;
cin>>s;
Bn a=toBn(s);
int b=4;
Bn ans=divide(a,b);
print(ans);
return 0;
}
分数的运算
#include<cstdio>
#include<algorithm>
using namespace std;
struct Frac
{
int up,down;
};
int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
}
void reduction(Frac &a)
{
if(a.down<0)
{
a.up=-a.up;
a.down=-a.down;
}
if(a.up==0)
a.down=1;
else
{
int factor=gcd(abs(a.up),abs(a.down));
a.up/=factor;
a.down/=factor;
}
}
Frac add(Frac a,Frac b)
{
Frac ans;
ans.down=a.down*b.down;
ans.up=a.up*b.down+b.up*a.down;
reduction(ans);
return ans;
}
Frac sub(Frac a,Frac b)
{
Frac ans;
ans.down=a.down*b.down;
ans.up=a.up*b.down-b.up*a.down;
reduction(ans);
return ans;
}
Frac multiply(Frac a,Frac b)
{
Frac ans;
ans.up=a.up*b.up;
ans.down=a.down*b.down;
reduction(ans);
return ans;
}
Frac divide(Frac a,Frac b)
{
Frac ans;
ans.up=a.up*b.down;
ans.down=a.down*b.up;
reduction(ans);
return ans;
}
void print(Frac a)//化简后的输出
{
if(a.down==1)
printf("%d",a.up);
else if(abs(a.up)>a.down)
printf("%d %d/%d",a.up/a.down,abs(a.up)%a.down,a.down);
else
printf("%d/%d",a.up,a.down);
printf("\n");
}
int main()
{
Frac a,b;
a.up=-4;
a.down=2;
b.up=4;
b.down=-6;
print(add(a,b));
print(sub(a,b));
print(multiply(a,b));
print(divide(a,b));
return 0;
}
输出:
-2 2/3
-1 1/3
1 1/3
3
--------------------------------
Process exited after 3.402 seconds with return value 0
请按任意键继续. . .