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("
");
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("
");
return 0;
}