【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