加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数相乘

发布时间:2020-12-14 03:29:26 所属栏目:大数据 来源:网络整理
导读:受计算机变量大小限制。当乘数过大时,计算机无法进行乘法,必须自己想法予以实现。 本程序可处理带小数的大数乘法运算。 运算结果正确。可以将前几年破解的 RSA-158 密码来试验 // 前几年破解的 RSA-158 密码是这样因数分解的 // result :39505874583265144

受计算机变量大小限制。当乘数过大时,计算机无法进行乘法,必须自己想法予以实现。

本程序可处理带小数的大数乘法运算。

运算结果正确。可以将前几年破解的 RSA-158 密码来试验


// 前几年破解的 RSA-158 密码是这样因数分解的
// result :39505874583265144526419767800614481996020776460304936454139376051579355626529450683609727842468219535093544305870490251995655335710209799226484977949442955603
// part1:3388495837466721394368393204672181522815830368604993048084925840555281177

// part2:11658823406671259903148376558383270818131012258146392600439520994131344334162924536139

运算时,先将乘数都反转。即倒着乘,主要是防止进位时没有空间了。最后将结果也反转输出即可

如12345 * 23

第一步 12345 -> 54321,23 ->32

第二步 相乘并进位后 539382

第三步 反转输出 283935 完成。

源代码如下:
 //

//   bignum.c

//  完成有小数位的俩个大数的乘法

//  Created by GPH on 13-7-14.

//  Copyright (c) 2013年 GPH. All rights

//


#include<stdio.h>

#define NUM_RESULT 200

#define NUM_PART 100


void convert(char *a,int *b);

void bigNumberMul(char *a,char*b,int count);

int split(char *a,char*b);



//先将字符串反转。

//再字符型数字转为数字,存在整形数组中,为乘法做准备

//若是高位放在数组头部,则进位时可能没有空间

//所以将低位放在数组头部。高位放尾部。

//输出时倒序即可

void convert(char *a,int *b)

{

    int l = strlen(a);

    char temp;

    for (int i = 0; i < l/2; i++)

    {

        temp = a[i];

        a[i] = a[l-i-1];

        a[l-i-1] = temp;

    }

    for (int i = 0; i < l; i++)

    {

        b[i] = a[i]-'0';

    }

}


//逐位相乘,再进位

void bigNumberMul(char *a,int count)

{

    int ih[NUM_RESULT]={};

    int ia[NUM_PART];

    int ib[NUM_PART];

    convert(a,ia);

    convert(b,ib);

    for (int i = 0; i < strlen(a); i++)

    {

        for ( int j = 0; j < strlen(b); j++)

        {

            ih[i+j] += ia[i]*ib[j];

        }

    }

    

    //逐次进位

    for (int i = 0; i < NUM_RESULT-1; i++)

    {

        ih[i+1] += ih[i]/10;

        ih[i] %= 10 ;

    }

    

    int i;

    for ( i = NUM_RESULT-1;i >= 0 ; i--)

    {

        if (ih[i])

        {

            break;

        }

    }

    for ( ;i >= 0 ; i--)

    {

        if(i == count-1)

        {

            printf(".");

        }

        printf("%d",ih[i]);

        

    }

}


//统计小数位共多少。并删除"."号

//用来最终输出时,确定小数位数

int split(char *a,char*b)

{

    int sum = 0;

    for (int i = 0;i< strlen(a) ; i++)

    {

        if(a[i] == '.')

        {

            //前移,删除'.'

            for (int j = i; j < strlen(a)-1 ; j++)

            {

                a[j] = a[j+1];

            }

            sum += strlen(a)-i-1;

            a[strlen(a)-1] = '';

            break;

        }

    }

    for (int i = 0;i< strlen(b) ; i++)

    {

        if(b[i] == '.')

        {

            //前移,删除'.'

            for (int j = i; j < strlen(b)-1 ; j++)

            {

                b[j] = b[j+1];

            }

            sum += strlen(b)-i-1;

            b[strlen(b)-1] = '';

            break;

        }

    }

    return sum;

}


int main(int argc,const char * argv[])

{

    char a[NUM_PART];

    char b[NUM_PART];

    int count;

    printf("input:");

    scanf("%s",a);

    printf("input:");

    scanf("%s",b);

    printf("n");

    getchar();

    count = split(a,b);//统计小数位

    

    bigNumberMul(a,b,count);

    

    printf("n");

    return 0;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读