zoukankan      html  css  js  c++  java
  • 大整数的乘法运算

       计算机存储数据是按照类型分配空间的,一般整形为两个字节范围在-32768~32767之间,长整形为4个字节32位,其范围在-2147483648~2147483647.现在我们利用数组来计算高精度数据(值超过长整形的范围): 

        例如:高精度数据*长整数

    算法如下:

    #include <iostream>
    #include<string.h>
    using namespace std;
    
    int main()
    {
        long b,c,d;
        int a[256],n;
        char str[256];
        printf("Input a great number:");
        scanf("%s",str);
        printf("input a long integer number:");
        scanf("%ld",&c);
        d=0;
        n=strlen(str);
        //计算前面n位数的值
        for(int i=0,j=n-1;i<n;i++,j--)
        {
            b=(str[j]-48)*c+d;
            a[i]=b%10;
            d=b/10;
        }
        //保存后面高位数据
        while(d)
        {
            a[n]=d%10;
            d=d/10;
            n++;
        }
    
        for(int i=n-1;i>=0;i--)
            printf("%d",a[i]);
    
        return 0;
    }
    

    编程求 n<=100时,n!的准确值。

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        long a[256], b, c, d;
        int m = 1, i, j,n,r;
        scanf("%d", &n);
        d = 0;
        a[1] = 1;
    
        for(i = 2; i <= n; i++)
        {
            for(j = 1; j <= m; j++)
            {
                c = a[j] * i + d;
                a[j] = c % 1000000;
                d = c / 1000000;
            }
            if(d)
            {
                a[j]=d;
                ++m;
            }
        }
        printf("%d!=",n);
        for(i=m;i>=1;i--)
        {
            if(a[i]==0)
                continue;
            else
            {
                r=i;
                break;
            }
        }
            printf("%ld",a[r]);
            for(i=r-1;i>=1;i--)
            {
                if(a[i]>99999)
                    printf("%ld",a[i]);
                else if(a[i]>9999)
                    printf("0%ld",a[i]);
                else if(a[i]>999)
                    printf("00%ld",a[i]);
                else if(a[i]>99)
                    printf("000%ld",a[i]);
                else if(a[i]>9)
                    printf("00000%ld",a[i]);
                else
                    printf("00000ld",a[i]);
            }
        return 0;
    }
    

    为节省空间,采用的是长整形数组,每个数组元素存6位



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    百度之星2019 初赛一 题解
    [NOI2019]弹跳(KD-Tree/四分树/线段树套平衡树 优化建图+Dijkstra)
    [BZOJ2157]旅游(树链剖分/LCT)
    [BZOJ3230]相似子串(后缀数组)
    回文树/回文自动机(PAM)学习笔记
    [CF30E]Tricky and Clever Password(KMP+manacher)
    APIO2019题解
    代码大全
    算法竞赛常用资料整理
    手动修复 Flash CS3 简中化不完全问题
  • 原文地址:https://www.cnblogs.com/gaot/p/4833816.html
Copyright © 2011-2022 走看看