大数相乘

来源:互联网 发布:玛丽女王大学知乎 编辑:程序博客网 时间:2024/05/20 20:45

大数相乘是指由于计算机无法保存的两数进行的乘法运算,因此我们可以通过字符数组来存储大数然后利用乘法规则自己编写算法将数组中的每一位相乘放到另外一个数组中。首先我们定义两个字符数组A、B分别存储两位大数,并将结果放到C中。若A的有效长度为lenA(出去符号之后的长度),B的有效长度为lenB,那么C的长度为lenA+lenB-1(最高位不进位)或lenA+lenB(最高位进位)。因此我们C数组的长度申请为lenA+lenB+1(包含'\0'的长度)。然后我们考虑A、B中的符号问题,利用函数Sign跳过A,B中的符号并将相乘后的符号放到变量sign中。由于我们平时进行的乘法运算都是从右往左算,这样保存在C数组中时也必须从右往左为算法带来了一些麻烦,于是我们可以考虑用一个函数将字符串进行翻转进行计算,算完后再将字符串翻转回去。在两数相乘的核心算法中我们用addCarry存储加法进位,用mulCarry存储乘法进位。计算的时候每乘一个数都立刻存放到C数组中。

</pre><pre class="cpp" name="code">#include <stdio.h>#include <string.h>#include <stdlib.h>//将字符串的顺序翻转void reverse(char *str,int p,int q){    char temp;    while(p<q)    {        temp=str[p];        str[p]=str[q];        str[q]=temp;        p++;        q--;    }}char *multiLargeNum(char *A, char *B){    int lenA = strlen(A);    int lenB = strlen(B);    int lenC = lenA+lenB;    char *C = new char[lenC+1];//最后一位存放'/0'    int mulCarry = 0;//乘法进位    int addCarry = 0;//加法进位    int temp1=0,temp2=0;    int i,j;    //翻转两串    reverse(A,0,lenA-1);    reverse(B,0,lenB-1);    //将该串字符全部变为'0'    for(i=0;i<lenC;i++)    {        C[i]='0';    }    C[i]='\0';    for(i=0;i<lenB;i++)    {        mulCarry = 0;        addCarry = 0;        for(j=0;j<lenA;j++)        {            //A[j]-48将字母转化为数字            temp1 = (A[j]-48)*(B[i]-48) + mulCarry;            mulCarry = temp1/10;            temp1=temp1%10;            temp2=(C[i+j] - 48) + temp1 + addCarry;            addCarry = temp2/10;            C[i+j] = temp2%10 + 48;        }        C[i+lenA] += addCarry + mulCarry;    }    reverse(C,0,lenC-1);    return C;}//用于判断大数的符号并对其进行调整void Sign(char *a,char *b){    char sign;//符号    //当A、B同为负号    if((a[0]=='-')&&(b[0]=='-')){        //跳过第一个字符        a++;        b++;        sign='+';    }else if((a[0]=='-')&&(b[0]!='-')){        a++;        sign='-';    }else if((a[0]!='-')&&(b[0]=='-')){        b++;        sign='-';    }else{        sign='+';    }    char *C = multiLargeNum(a,b);    printf("C=");    if(sign=='-')        printf("%c",sign);//打印负号    if(C[0]==0)        puts(C+1);    puts(C);//打印结果部分    delete[] C;}int main(){    char A[] = "973432463";    char B[] = "-24566";    Sign(A,B);    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 下颌骨错位脸歪怎么办 假体隆鼻感冒了怎么办 打了玻尿酸怀孕怎么办 鼻子上有出血点怎么办 内眼角开小了怎么办 上眼皮肿怎么办小妙招 嫁接的睫毛乱了怎么办 睫毛掉进眼睛里怎么办 痘痘留下的疤痕怎么办 宫颈癌前病变1级怎么办 纹身后结痂很厚怎么办 纹身结痂蹭掉了怎么办 药流20天同房了怎么办 药流23天同房了怎么办 小产后不来月经怎么办 人流12天同房了怎么办 人流20天同房了怎么办 人流后5天同房了怎么办 人流后3天同房了怎么办 人流20后同房了怎么办 上环后月经量多怎么办 上环后喝啤酒了怎么办 取环当天同房了怎么办 生完孩子有外痔怎么办 怀孕了宫腔积液怎么办 做完爱4天怕怀孕怎么办 半永久眉失败了怎么办 取环前2天同房了怎么办 怀孕了发现有子宫肌瘤怎么办 宫腔中央性粘连怎么办 孕妇宫腔粘连带怎么办 内膜厚怎么办吃什么好 功血引起的贫血怎么办 吃宫血宁后月经不来了怎么办 孕晚期胎心不好怎么办 胎心不好怎么办让住院 39 5胎心不好怎么办 肺长了一个肿瘤怎么办 血糖高伤口不愈合怎么办 有轻微的狐臭该怎么办 嘴上汗毛太重怎么办