7-1 高精度计算-n的阶乘 (100分)
用高精度方法,求 N!的精确值(N 以一般整数输入)。
输入样例:
10
输出样例:
3628800
代码:
#include "stdio.h"
#define MAX 10000
int f[MAX]; void Arr_reset(int a[],int m,int n) { int i; for(i=m;i<=m;i++) { a[i]=0; } } int main(void) { int i,j,n; scanf("%d",&n); Arr_reset(f,0,(sizeof(f)/sizeof(int)));//对数组进行初始化
f[0]=1; for(i=2;i<=n;i++) { //乘以 i
int c=0; for(j=0;j<MAX;j++)//最不易理解的
{ int s=f[j]*i+c; f[j]=s%10; c=s/10; //算出的 s 是单位数时,会连续覆盖 f[0] //否则一个多位数会倒过来存储,如 123,f[0]存 3,f[1]存 2,f[3]存 1 //因此上式先求余,在求模
} } for(j=MAX-1;j>=0;j--) if(f[j]) break;//忽略前导 0
for(i=j;i>=0;i--) printf("%d",f[i]); printf("\n"); return 0; }
7-2 高精度计算- 求a/b的高精度值 (100分)
计算A/B的精确值,设A,B是以一般整数输入,计算结果精确到小数后20位(若不足20位,末尾不用补0)。
输入样例1:
4 3
输出样例1:
4/3=1.33333333333333333333
输入样例2:
6 5
输出样例2:
6/5=1.2
输入样例3:
30 5
输出样例3:
30/5=6.0
代码:
#include<stdio.h>
int main() { int a, b, num[21];//num存小数部分
scanf("%d %d", &a, &b); printf("%d/%d=%d.", a, b, a / b); for (int i = 1; i <= 20; i++) { a %= b; a *= 10; num[i] = a / b; } int i = 20; while (num[i] == 0 && i > 1)//从小数部分最后往前排除0
i--; for (int j = 1; j <= i; j++)//输出
printf("%d", num[j]); return 0; }
7-3 高精度计算-n的累加和 (100分)
用高精度方法,求s=1+2+3+……+n的精确值(n以一般整数输入)。
输入样例:
10
输出样例:
55
代码:
#include<iostream> #include<cstring> #include<string>
using namespace std; int main() { char str1[256],str2[256]; int a[256],b[256],c[256]; int lena,lenb,lenc; int x; int i,j; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); cin>>str1;//输入乘数str1 //cin>>str2;//输入乘数str2
strcpy(str2,str1); lena=strlen(str1); lenb=strlen(str2); for(i=0;i<=lena-1;i++)//乘数str1存入数组a
a[lena-i]=str1[i]-'0'; for(i=0;i<=lenb-1;i++)//乘数str2存入数组b
b[lenb-i]=str2[i]-'0'; b[1]++; for(int i = 1; i < lenb; i++) { if(b[i]>=10) { b[i] = 0; b[i+1]++; } else { break; } } for(i=1;i<=lenb;i++) { x=0;//用于存放进位
for(j=1;j<=lena;j++)//对乘数每一位进行处理
{ c[i+j-1]=a[j]*b[i]+x+c[i+j-1];//当前乘积+上次乘积进位+原数
x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lena]=x;//进位
} lenc=lena+lenb; for(i=lenc;i>=1;i--) { if(c[i]%2==0) { c[i]/=2; } else { c[i-1]+=10; c[i]/=2; } } while((c[lenc]==0)&&(lenc>1))//删除前导0
lenc--; for(i=lenc;i>=1;i--)//倒序输出
{ cout<<c[i]; } cout<<endl; return 0; }
7-4 高精度计算-阶乘和 (100分)
已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=123……(N-1)N,如:3!=12*3=6。 请编程实现:输入正整数N,输出计算结果S的值。
输入样例:
4
输出样例:
33
代码:
#include<stdio.h>
#define N 10000
int main() { int i, j, x, k, n, b[N] = { 0 }; scanf("%d", &n); if (n <= 1) { printf("1"); return 0; } for (k = 1; k <= n; k++) { int a[N] = { 0 }; a[9999] = 1; for (i = 1, x = 0; i <= k; i++) for (j = 9999; j >= 0; j--) { a[j] = a[j] * i + x; x = a[j] / 10; a[j] = a[j] % 10; } for (j = 9999; j >= 0; j--) { b[j] = b[j] + a[j]; if (b[j] >= 10) { b[j - 1]=b[j-1]+1; b[j] = b[j]-10; } } } for (i = 0; i < N; i++) if (b[i] != 0) break; for (x = i; x < N; x++) printf("%d", b[x]); return 0; }
7-5 高精度计算-高精度求积 (100分)
输入两个高精度正整数M和N(M和N均小于100位)。 求这两个高精度数的积。
输入样例:
36 3
输出样例:
108
代码:
#include<stdio.h> #include<string.h>
int main() { char s1[1500], s2[1500]; scanf("%s%s", s1, s2); int n = strlen(s1), m = strlen(s2); int a[n], b[m]; int i, j; for (i = 0, j = n - 1; i < n; i++, j--) { a[i] = s1[j] - '0'; } for (i = 0, j = m - 1; i < m; i++, j--) { b[i] = s2[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; }