PAT中较难的固定操作

大整数的运算

#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
请按任意键继续. . .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值