【C语言高精度计算】—— n的阶乘 | 求a/b的高精度值 | n的累加和 | 阶乘和 | 高精度求积


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; }

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM