user-0 提问: C语言实现超大整数四则运算

回复:
user: user-1
content: 那是留给进位用的 。 你自己判断一下， a【0】是否是‘0’  如果是就从a【1】输出，不是就从a【0】输出

user: user-0
content: 引用 6 楼 寻开心 的回复:#include <stdio.h> #include <string.h> #define MAX 100 int main() {     char  a[MAX+2]={'0'}, b[MAX+2]={'0'};     int x;      printf("Please Input a and b:\n");     scanf("%s%s", &(a[1]), &(b[1])); // 控制第一个位置保留给可能出现的进位     printf("array status:\na=%s\nb=%s\n",a,b);     int len1 = strlen(a); // a的长度     int len2 = strlen(b); // b的长度     int len = len1<len2 ? len2 : len1; // a和b中最长是多长      if (len1>len2) {//移动b和a对齐尾巴         for (x=0; x<=len2; x++) // 移动             b[len-x]=b[len2-x];         for (x=0;x<len1-len2;x++) // 空出的头用‘0’填补             b[x+1]='0';         printf("After Move B:\na=%s\nb=%s\n",a,b);     } else if (len1<len2) {         for (x=0; x<=len1; x++)             a[len-x]=a[len1-x];         for (x=0;x<len2-len1;x++)             a[x+1]='0';         printf("After Move A:\na=%s\nb=%s\n",a,b);     };     printf("Begin Add....\n");     int t, c=0;     for ( x=len-1; x>=0; x--) {         t = a[x]-'0'  + b[x]-'0' + c; // c是进位         c = t>=10 ? 1 : 0;         t %= 10;         a[x] = t + '0';     };     printf("Result in A:\na=%s\nb=%s\n",a,b);     return 0; }为什么前面会有零？好像不能有零的吧？

user: user-0
content: 还是不太懂

user: user-1
content: #include <stdio.h> #include <string.h> #define MAX 100 int main() {     char  a[MAX+2]={'0'}, b[MAX+2]={'0'};     int x;      printf("Please Input a and b:\n");     scanf("%s%s", &(a[1]), &(b[1])); // 控制第一个位置保留给可能出现的进位     printf("array status:\na=%s\nb=%s\n",a,b);     int len1 = strlen(a); // a的长度     int len2 = strlen(b); // b的长度     int len = len1<len2 ? len2 : len1; // a和b中最长是多长      if (len1>len2) {//移动b和a对齐尾巴         for (x=0; x<=len2; x++) // 移动             b[len-x]=b[len2-x];         for (x=0;x<len1-len2;x++) // 空出的头用‘0’填补             b[x+1]='0';         printf("After Move B:\na=%s\nb=%s\n",a,b);     } else if (len1<len2) {         for (x=0; x<=len1; x++)             a[len-x]=a[len1-x];         for (x=0;x<len2-len1;x++)             a[x+1]='0';         printf("After Move A:\na=%s\nb=%s\n",a,b);     };     printf("Begin Add....\n");     int t, c=0;     for ( x=len-1; x>=0; x--) {         t = a[x]-'0'  + b[x]-'0' + c; // c是进位         c = t>=10 ? 1 : 0;         t %= 10;         a[x] = t + '0';     };     printf("Result in A:\na=%s\nb=%s\n",a,b);     return 0; }

user: user-0
content: 抱歉，我还没学到指针，可以不用指针吗

user: user-1
content: #include <stdio.h> #include <string.h> #define MAX 100 int main() {     char a[MAX*2+2], b[MAX*2+2];      memset(a, '0', 202 ); // 不能a来假定所有的内容都自动填充为‘0’     memset(b, '0', 202 );     printf("Please Input a and b:\n");     scanf("%s%s", a+MAX, b+MAX);     int len1 = strlen(a+MAX); // a的长度     int len2 = strlen(b+MAX); // b的长度     if (len1>100 || len2 > 100 ) return 0; // 溢出了，后面不用跑了     char * p1 = a+MAX; // a头指针     char * p2 = b+MAX; // b头指针     int len = len1<len2 ? len2 : len1; // a和b中最长是多长     p1 += len1-1; // 定位到尾巴     p2 += len2-1; // 定位到尾巴     int i = 0;     int c = 0, t=0;     for ( i=len; i>=0; i--, p1--, p2--) { // 从尾巴开始向前做加法         t = *p1-'0'  + *p2-'0' + c;         if ( t>=10 ) c = 1; else c=0;         *p1 = (t%10) + '0';     };     if ( p1[1] == '1')  // 最高位是否有进位         printf("%s\n", p1+1); // 有进位     else         printf("%s\n", p1+2); // 无进位     return 0; } 临时写的加法，  a+b结果还放入到a里面了

user: user-0
content: 请问能写出来吗，想参考一下代码

user: user-1
content: 大数加减法，模拟小学生开始学多位加减的时候的规则  加法     定义最长数组 a[102] = {'0' }, b[102]={'0'}     读取数据放到a[1]和b[1]开始的地方     strlen计算a和b字符串的长度， 把短的向后移动保证尾巴对齐，前面空出来的用‘0’补上     循环从尾巴开始进行加法并进位     a【0】和b【0】只会是0+0+进位数，不会溢出。     输出的时候判断0位是否为1，决定是从0还是从1位开始输出字符串  减法     和加法类似     先把两个字符串读入后弄成等长度，短的前面用0补充     然后strcmp比较，用大的减去小的，同样从尾巴开始一次循环搞定  牺牲空间节约时间的一点小改进     把数组a和b开成2倍大小， 202长度， 并把所有的内容都初始化为‘0’     把数据读入放到a【100】，b【100】的地方     这样可以不用做字符串的移动来对齐尾巴，只要改变一下指针的位置就可以对齐尾巴了