自写大数运算(加,乘,阶乘)

害怕蓝桥c+组考大数,练习一ha子
大数加法
验证代码点这里

#include<iostream>
using namespace std;
int a[101],b[101],res[101];
int len;
string sa,sb;
void getSum()
{
	for(int i=0;i<=len;i++)
	{
		res[i]+=(a[i]+b[i]);
		if(res[i]>=10)
		{
			res[i+1]+=res[i]/10;
			res[i]%=10;
			if(i+1>len)//因为进位会导致结果位数改变,这里len动态变化
				len=i+1;
		}
	}
	string s=sb;
	if(sa.length()>sb.length())s=sa;
	for(int i=len+1;i<s.length();i++)
		res[i]=s[s.length()-i-1]-'0';//注意这里的索引
	if(len<s.length()-1)
		len=s.length()-1;
}
int main()
{
	cin >> sa >> sb;
	for(int i=sa.length()-1;i>=0;i--)
		a[sa.length()-i-1]=sa[i]-'0';//倒序存储数
	for(int i=sb.length()-1;i>=0;i--)
		b[sb.length()-i-1]=sb[i]-'0';
	len=min(sa.length(),sb.length())-1;//索引从0-len闭区间
	getSum();
	for(int i=len;i>=0;i--)
		cout << res[i];
} 

大数乘法
验证代码点这里

#include<iostream>
#include<string>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn],res[maxn];
string sa,sb;
int main()
{
	cin >> sa >> sb;
	
	for(int i=sa.length()-1;i>=0;i--)//先颠倒字符串并转为int数组
		a[sa.length()-i-1]=sa[i]-'0';
	
	for(int i=sb.length()-1;i>=0;i--)
		b[sb.length()-i-1]=sb[i]-'0';

	for(int i=0;i<sb.length();i++)
		for(int j=0;j<sa.length();j++)
			res[i+j]+=b[i]*a[j];
	int n;
	n=sa.length()+sb.length();
	for(int i=0;i<n-1;i++)//进位操作
	{
		if(res[i]>=10)
		{
			res[i+1]+=res[i]/10;
			res[i]%=10;
		}
	}
	int t=n+5;//查看的位数应该比算的多几位
	while(res[t]==0)//去掉计算可能产生的前导0
		t--;
	for(int i=t;i>=0;i--)
		cout << res[i];
} 

大数阶乘
阶乘比加乘法简单点
验证代码点这里

#include<iostream>
using namespace std;
int a[100000];
int n,cnt;
void f(int x)
{
	for(int i=0;i<=cnt;i++)
		a[i]*=x;
	for(int i=0;i<=cnt;i++)
	{
		if(a[i]>=10)
		{
			a[i+1]=a[i+1]+a[i]/10;
			a[i]%=10;
			if(i+1>cnt)
				cnt=i+1;
		}
	}
}
int main()
{
	cin >> n;
	a[0]=1;
	cnt=0;
	for(int i=2;i<=n;i++)
		f(i);
	for(int i=cnt;i>=0;i--)
		cout << a[i];
} 

矩阵乘法
验证代码点这里

#include<iostream>
#include<cstring>
#define maxn 35
using namespace std;
struct Matrix{
	int matrix[maxn][maxn];
};
int n,m;
Matrix mx;
Matrix mul(Matrix a,Matrix b)
{
	Matrix res;
	int t;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			t=0;
			for(int k=0;k<n;k++)
				t+=a.matrix[i][k]*b.matrix[k][j];
			res.matrix[i][j]=t;
		}
	}
	return res;
}
void power(int m)
{
	Matrix res,t;
	memset(res.matrix,0,sizeof(res.matrix));
	for(int i=0;i<n;i++)
		res.matrix[i][i]=1;
	memcpy(t.matrix,mx.matrix,sizeof(t));
	while(m)
	{
		if(m&1)
			res=mul(res,t);
		t=mul(t,t);
		m>>=1;
	}
	for(int i=0;i<n;i++)//矩阵快速幂
	{
		for(int j=0;j<n;j++)
		{
			if(!j)
				cout << res.matrix[i][j];
			else
				cout << " " << res.matrix[i][j];
		}
		cout << endl;
	}
} 
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			scanf("%d",&mx.matrix[i][j]);
	power(m);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值