从此走上不归路…
一、高精度乘法
耿直给代码:
//高精度乘法
#include<cstdio>
#include<cstring>
int main() {
char num1[1500], num2[1500];
scanf("%s%s", num1, num2);
int n = strlen(num1), m = strlen(num2);
int a[n], b[m];
int i, j;
for (i = 0, j = n - 1; i < n; i++, j--) {
a[i] = num1[j] - '0';
}
for (i = 0, j = m - 1; i < m; i++, j--) {
b[i] = num2[j] - '0';
}
int c[3000];
for (i = 0; i < 3000; i++) {
c[i] = 0;
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
c[i + j] += a[i] * b[j];
}
}
for (i = 0; i < n + m; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
for (j = 2999; j > 0; j--) {
if (c[j] != 0)
break;
}
for (i = j; i >= 0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
二、求N!的值(高精度)
源代码:
//求N!的值
#include<cstdio>
#include<iostream>
#define maxn 5555
using namespace std;
int f[maxn];
int main()
{
freopen("ni.in","r",stdin);
freopen("ni.out","w",stdout);
int n;
cin>>n;//输入
memset(f,0,sizeof(f));//初始化
f[1]=1;//f保存被乘数,每一次运算成果
for(int i=2;i<=n;i++)
{
int c=0;
for(int j=1;j<=maxn;j++)
{
int s=f[j]*i+c;
f[j]=s%10;
c=s/10;
}
}
int beg;
for(beg=maxn;beg>=1;--beg)
if(f[beg])
break;
for(int i=beg;i>=1;i--)
cout<<f[i];
fclose(stdin);
fclose(stdout);
return 0;
}
三、阶乘和(高精度)
代码:
//阶乘和
#include<cstdio>
#include<iostream>
#define maxn 30001
using namespace std;
int s[maxn]={0},a[maxn]={0,1};
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int i,n,al=1,j,sl=1,k,l=1,v=1;
cin>>n;//输入
a[0]=1;s[0]=1;
if(n==1)
printf("%d\n",s[0]);//为1 则阶乘和为1
for(int k=1;k<=n;k++)
{
for(j=1;j<=al;j++)
a[j]*=l;
for(j=1;j<=al;j++)
{
if(a[j]>=10)//处理进位
{
a[j+1]+=a[j]/10;
a[j]%=10;
v++;
}
}
al++;
while(a[al]>=10)//处理最高位
{
a[al+1]=a[al]/10;
a[al]%=10;
al++;
v++;
}
l++;
sl=sl>al?sl:al;
for(i=1;i<=sl;i++)
{
s[i]+=a[i];
if(s[i]>=10)
{
if(i==sl)
sl++;
s[i]%=10;
s[i+1]++;
}
}
al=v;
}
for(i=sl;i>=1;i--)//去除前导0
{
if(s[i]==0&&sl>1)
sl--;
else
break;
}
for(i=sl;i>=1;i--)
printf("%d",s[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
…我已经没有动力做完九道题了
四、万进制计算N!精确值(高精度)
代码如下:
#include<cstdio>
#include<cstring>
#define max 8001
unsigned n,a[max];
int main()
{
freopen("ni.in","r",stdin);
freopen("ni.out","w",stdout);
int i,j;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(i=2,a[0]=1;i<=n;i++)
{
for(j=0;j<max;j++) a[j]*=i;
for(j=0;j<max;j++)
{
a[j+1]+=a[j]/100000;
a[j]%=100000;
}
}
for(i=max-1;i>=0&&!a[i];i--);
printf("%d",a[i--]);
for(;i>=0;i--) printf("%05d",a[i]);
printf("\n");
return 0;
}