大数加法和大数阶乘
大数加法
关键是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数组先逆置一下数组。