• 【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("
    ");
        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;
    }
  • 相关阅读:
    POJ2184 01背包变形 xingxing在努力
    HDU2955 01背包变体 xingxing在努力
    Uva624 01背包输出方案 xingxing在努力
    HDU2602 01背包 xingxing在努力
    Jersey初谈
    Jersey初谈
    Oracle基本语句
    Oracle基本语句
    2013下半年工作总结
    2013下半年工作总结
  • 原文地址:https://www.cnblogs.com/CoffeeSoul/p/13833081.html
Copyright © 2020-2023  润新知