首页 > 代码库 > 超长位数的字符数的加法与乘法
超长位数的字符数的加法与乘法
超长位数的字符数的加法:
测试用例:112233445566778899 + 998877665544332211 = 1111111111111111110
程序代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 #define MAXLEN 100 5 6 void add(char * a,char * b,char * c) 7 { 8 int i,j; 9 int sa = strlen(a);10 int sb = strlen(b);11 int max = sa>sb ? sa : sb;12 int * s = (int *)malloc(sizeof(int) * (max + 1));//为保证运算和的不溢出,应是最长操作数的位数+1,范围是[0,max];13 int * A = (int *)malloc(sizeof(int) * max);14 int * B = (int *)malloc(sizeof(int) * max);15 16 for(i=0;i<max;i++)17 A[i] = B[i] = s[i] = 0; //先初始化为0,防止高位相加时对应位不存在导致的问题18 s[max] = 0;19 20 for(i=0;i<sa;i++) //将a倒置以便低位对齐相加21 A[i] = a[sa - i - 1] - ‘0‘;22 23 for(i=0;i<sb;i++)24 B[i] = b[sb - i - 1] - ‘0‘;25 26 for(i=0;i<max;i++)27 s[i] = A[i] + B[i];28 29 for(i=0;i<max;i++) //集中处理进位问题30 {31 if(s[i]>=10) // 若i = max-1时有进位,则s[max] != 032 {33 s[i+1] += s[i] / 10;34 s[i] %= 10;35 }36 }37 38 if(s[max] != 0) //最高位有进位数据范围为[0,max]39 {40 for(j=0;j<=max;j++)41 {42 c[j] = s[max - j] + ‘0‘;43 }44 c[max+1] = ‘\0‘;45 }46 else //最高位无进位,数据范围为[0,max-1]47 {48 for(j=0;j<max;j++)49 {50 c[j] = s[max -1 - j] + ‘0‘;51 }52 c[max] = ‘\0‘;53 }54 }55 56 57 int main()58 {59 char a[MAXLEN];60 char b[MAXLEN];61 char c[2 * MAXLEN];62 while(scanf("%s + %s",a,b) != EOF)63 {64 add(a,b,c);65 printf("%s + %s = ",a,b);66 puts(c);67 }68 return 0;69 }
超长位数的字符数的乘法:
测试用例:112233445566778899 * 998877665544332211 = 112107482103740987777903741240815689
程序代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 #define MAXLEN 100 5 6 void multiply(char * a,char * b,char * c) 7 { 8 int i,j,ca,cb,* s; 9 ca = strlen(a); //a操作数的位数10 cb = strlen(b); //b操作数的位数11 s = (int*)malloc(sizeof(int)*(ca+cb)); //s指向能够存储a和b的空间12 for (i=0;i<ca+cb;i++)13 s[i] = 0; //初始化s数组元素全为014 for (i=0;i<ca;i++)15 for (j=0;j<cb;j++)16 s[i+j+1] += (a[i]-‘0‘) * (b[j]-‘0‘);17 18 for (i=ca+cb-1;i>=0;i--)19 if (s[i]>=10)20 {21 s[i-1] += s[i]/10; //高位加上低位的进位22 s[i] %= 10;23 }24 i=0;25 while (s[i]==0)26 i++;27 for (j=0;i<ca+cb;i++,j++)28 c[j] = s[i] + ‘0‘;29 c[j]=‘\0‘;30 free(s);31 }32 33 34 int main()35 {36 char a[MAXLEN];37 char b[MAXLEN];38 char c[2 * MAXLEN];39 while(scanf("%s * %s",a,b) != EOF)40 {41 multiply(a,b,c);42 printf("%s * %s = ",a,b);43 puts(c);44 }45 return 0;46 }
超长位数的字符数的加法与乘法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。