从此走上不归路…
一、高精度乘法
耿直给代码:
//高精度乘法 #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; }