Very Easy !!! (大数模拟加法乘法)
发布时间:2020-12-14 04:52:05 所属栏目:大数据 来源:网络整理
导读:大数乘法+加法。 这是借鉴网上的模板。 题目链接:vjudgeUVA-10523 #includecstdio #includeiostream #includecmath #includecstring #includealgorithm using namespace std ; const int maxn= 10010 ; const int base= 10 ; struct inter{ int num[maxn];
大数乘法+加法。 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int base=10;
struct inter{
int num[maxn];
int cnt;
};
inter a,b;
//大数模拟加减法 ---模板可套用
//幂运算+求和
void muti(int k)//
{
for(int i=0;i<a.cnt;i++)
{
a.num[i]*=k;
}
int i;
for(i=0;i<a.cnt;i++)
{
a.num[i+1]+=a.num[i]/base;
a.num[i]%=base;
}//剩余之后
while(a.num[i])
{
a.num[i+1]+=a.num[i]/base;
a.num[i]%=base;
i++;
}
while(i>=0&&!a.num[i]) i--;//去零
a.cnt=i+1;
}
inter add(inter &x,inter &y)//相加
{
inter tmp;
memset(tmp.num,0,sizeof(tmp.num));
tmp.cnt=0;
for(int i=0,j=0,g=0; ; i++,j++)
{
if(g==0 && i>=x.cnt && j>=y.cnt) break;
int t = g;
if(i<x.cnt) t+= a.num[i];
if(j<y.cnt) t+= b.num[i]; //这个挺好
tmp.num[tmp.cnt++] = t%base;
g = t/base;
}
return tmp;
}
int main()
{
int N,A;
while(scanf("%d%d",&N,&A)!=EOF)
{
if(A==0)
{
printf("0n");
continue;
}
memset(a.num,sizeof(a.num));
memset(b.num,sizeof(b.num));
b.cnt=a.cnt=0;
for(int i=1;i<=N;i++)
{
memset(a.num,sizeof(a.num));
a.cnt=1,a.num[0]=1;
for(int j=1;j<=i;j++)
muti(A);//累乘
muti(i);
b=add(a,b);
}
for(int i=b.cnt-1;i>=0;i--)
printf("%d",b.num[i]);
printf("n");
}
return 0;
}
参考链接1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |