数学加减法编程 大整数加法c语言思路( 二 )

<='9') /*若为数字则存入*/ { q=(struct remain *)malloc(sizeof(struct remain)); /*申请空间*/ q->num=c-'0'; /*存入一位整数*/ q->np=p; /*建立指针*/ p=q; } s=(NODE *)malloc(sizeof(NODE)); s->data=-1; /*建立表求超长正整数的链头*/ ps=s; while(p!=NULL) /*将接收的临时数据链中的数据转换为所要求的标准形式*/ { sum=0;i=0;k=1; while(i<4&&p!=NULL) /*取出低四位*/ { sum=sum+k*(p->num); i++; p=p->np; k=k*10; } qs=(NODE *)malloc(sizeof(NODE));/*申请空间*/ qs->data=sum; /*赋值,建立链表*/ ps->next=qs; ps=qs; } ps->next=s; return s;}void printint(NODE *s){ if(s->next->data!=-1) /*若不是表头,则输出*/ { printint(s->next); /*递归输出*/ if(s->next->next->data==-1) printf("%d",s->next->data); else{ int i,k=HUNTHOU; for(i=1;i<=4;i++,k/=10) putchar('0'+s->next->data%(k)/(k/10)); } }}/*********************************************************** This program is to calculate ** the addition of king sized positive integer. ********************************************************** >> Input S1= 1234567890 >> Input S2= 987654321123456789 >> The addition result is as follows. S1= 1234567890 S2= 987654321123456789 S1+S2=987654322358024679 Press any key to quit... */2 大数相乘
当位数超过整数数据类型的两个大数相乘时,大数可以使用字符串存储,模拟手工做乘法的过程(不同的是,先从高位开始),将每一位相乘的结果先不做进位,累加到一个数组对应下标的元素中,最后做进位处理 。
以下是模拟过程:

数学加减法编程 大整数加法c语言思路

文章插图
使用双重循环得出TempResult[1]=10,TempResult[2]=32,TempResult[3]=24
数组逐元素逆序迭代处理进位和求余:
for (i = alen + blen; i >=0; i--) // 处理进位、各数求10的模数,//TempResult[alen + blen]是结果的最低位,逆序处理 { if (TempResult[i] >= 10) { TempResult[i - 1] += TempResult[i] / 10; // i-1位是i位的高位 TempResult[i] %= 10; } }然后将整数数组逐项赋值给字符数组即可 。
code:
#include<stdio.h> #include<stdlib.h>#include<string.h>// 因为大数过长,所以采用字符串存储,故要将字符串中字符转化为数字char *BigDataMutliply(char *DataA, char *DataB){ int alen = strlen(DataA); int blen = strlen(DataB); size_t size = sizeof(int)*(alen + blen); int *TempResult = (int *)malloc(size); // 动态数组存储两数各个位相乘的结果 char *Result = (char *)malloc(sizeof(char)*(alen + blen + 1)); memset(TempResult, 0, size); for (int i=0 ; i<alen; i++) // 从高位开始,迭代出各个位的值存储到数组对应的位 { for (int j=0; j<blen; j++) TempResult[i+j+1] += (DataA[i] - '0')*(DataB[j] - '0');// 最高位留出一位,待进位 } for (i = alen + blen; i >=0; i--) // 处理进位、各数求10的模数 { if (TempResult[i] >= 10) { TempResult[i - 1] += TempResult[i] / 10; TempResult[i] %= 10; } } i=0; while (TempResult[i] == 0) // 计算数组不包括前导0的位数 i++; int j; for(j=0; i < alen + blen + 1; j++, i++)// 将整数数组转换到字符数组 { Result[j] = TempResult[i] + '0'; } Result[j-1] = '\0'; // 最后位置\0 return Result;}int main(){ char *A = "111111111"; char *B = "111111111"; char *res = BigDataMutliply(A, B); printf("res = %s\n",res); // 12345678987654321 system("pause"); return 0;}3 大数阶乘
对于一个较小的数的阶乘,较容易通过循环和递归去实现 。
对于一个较大的数的阶乘,其结果因为位数较多,基本数据类型无法存储 。可以考虑用一个数组a来保存结果的每一位 。如计算7的阶乘,模拟过程如下:
数学加减法编程 大整数加法c语言思路

文章插图
如8!=8*7!=8*5040
a[0] =8*0 = 0
a[1] = 8*a[1]+a[0]/10 = 32

推荐阅读