害怕蓝桥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);
}