大数加法和大数阶乘

大数加法

关键是plus那一步中的m<MAXSIZE,无需担心最高位rem不能再次进位,因为循环一直遍历到整个数组

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
void print(int *buffer){
    int i=MAXSIZE-1;
    while(!buffer[i])
        --i;
    
    while(i>=0)
        printf("%d",buffer[i--]);
}
void transform(char *num,int len,int *buffer){//逆序转换数组,个位转到了数组的低位
    for(int i=0,j=len-1;i<=MAXSIZE&&j>=0;i++,j--)
        buffer[i]=num[j]-'0';//把char转成int类型
}
void plus(int *buffer1,int *buffer2,int *buffer3){//核心算法
    int rem=0;
    for(int i=0;i<MAXSIZE;i++){
        rem+=(buffer1[i]+buffer2[i]);
        buffer3[i]=rem%10;
        rem/=10;
    }
    
    print(buffer3);
}
void multiply(int *buffer3){
    
}
int main(){//大数加法
    char num1[]="765890345";
    char num2[]="345356457";
    
    int len1=(int)strlen(num1);
    int len2=(int)strlen(num2);
    
    static int buffer1[MAXSIZE]={0};
    static int buffer2[MAXSIZE]={0};
    static int buffer3[MAXSIZE]={0};
    
    transform(num1, len1, buffer1);
    transform(num2, len2, buffer2);
    
    plus(buffer1, buffer2, buffer3);
} 

大数阶乘

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

void print(int *num){//因为这个数字第1位是个位,所以需要逆序输出
    int i=MAXSIZE-1;
    while(!num[i])
        --i;
    
    for(;i>=0;i--)
    printf("%d",num[i]);
}

void multiply(int *num,int n){//传入阶乘当中的数字和当前数组当中的每一位进行乘法运算
    int rem=0;//设置一个进位的变量rem,当rem超过10了就需要进行进位
    for(int i=0;i<MAXSIZE;i++){//这个地方循环maxsize次,所以不用担心rem是个超大的数字而无法给高位进位
        rem+=num[i]*n;//让阶乘当中的数字和数组的每一位都做乘法
        num[i]=rem%10;//当超过10了就需要进位,个位则加给当前数
        rem/=10;//大于10的就留下来进位,因为循环maxisze次,所以不必担心如果是个100000这样的数没法进位完全,会在高位补齐
    }
}

int main(){
    int num[MAXSIZE]={1};
    int number=11;
    
    for(int i=2;i<=number;i++)//11的阶乘从2开始,通过for循环不断的和数组当中的数字进行乘法运算
    multiply(num, i);
    
    print(num);
}

 

大数乘法

大数之间的乘法就类似常规的乘法

第一步相乘,把每一层乘的结果放到一个数组里面

接着用一个转化数组,把特殊的数组通过rem的方式转为常规的数组

一次把28,20,12先存入数组,数组变为{12,20,28}

再把56,40,24一一对应的方式通过加法存入数组,数组{24,52,76,28}

再把9,15,21通过加法的方式存入数组{9,39,73,76,28}

 

通过rem的方式从右边开始加起

void convert_normal(int number[])//转换函数,将result数组中的数值转化为正常数字
{
    for(int i=0,up=0;i<N;i++)
    {
        int temp=number[i]+up;
        number[i]=temp%10;
        up=temp/10;
    }
}

就得出了最终的结果。

这里最好引入一个buffer数组先逆置一下数组。

posted @ 2021-07-12 22:01  雾漫大武汉  阅读(221)  评论(0编辑  收藏  举报