user-0 提问: 咳，代码写得少，问题就多了，我请教来了。

回复:
user: user-1
content: 引用 7 楼 zhaozhaohelu 的回复:引用 6 楼 zxh707wk 的回复:引用 3 楼 zhao4zhong1 的回复:+1，我只是围观的。。。没事没事，见者有份！ 有没有我的嘞？

user: user-0
content: 引用 6 楼 zxh707wk 的回复:引用 3 楼 zhao4zhong1 的回复:+1，我只是围观的。。。没事没事，见者有份！

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:+1，我只是围观的。。。

user: user-0
content: 今天下午的时候一直被卡在最高位进位的问题没法解决，后面尝试了一下手动给高位赋值，不知道这种做行可不可行。效果是有了。目前程序还有漏洞，就是输入进制之后，接下来没有检查加数与被加数是否合法，比较进制N=6，加数=653，被加数=172。这显然不科学。不过我想这几天看一看多线程部分，把知识夯一夯。这样吧，我再等一个有效回复，好把分数分成4份，每人10分。赵老师您老见谅哦。很显然我的代码不够简洁，回头研究研究您老的代码。 /*现在和外星人打交道，发现外星人使用的并非10进制或者16进制等，有些星球居然使用N进制（N在2-35之间）， 以下的1001个题目中我们将首先给你一个数字表示N进制，然后给出两个数字的字符串。请算出其求和结束并输出。 数字的字符串其中包括0-9和a-z（表示10-35） 详细描述如下： 	int Calc(int n,const char* num1,const char * num2,char * result) 	输入参数： 	n:		n进制 	num1：	加号左边的数字 	num2：	加号右边的数字 	result：得数 返回值： 	int:	如果计算成功返回0，否则返回-1 	约定：所有输入和输出都是数字或者小写字母，不存在其他字符 		result内存外部申请和释放 	实现：如果任何一个字符串为空或者空串都非法，不用再计算result */ #include <iostream> #include <cstring> using namespace std; ///////////////////////////////////////////////////////////////// //1.对传入的加数与被加数进行倒置 //2.加数与被加数同位相加 //3.进位处理 //4.再次倒置 //  问题描述：实现A+B=C   其中A、B位数超过100位  //  算法思想：大数使用字符串存储，每一个单元存储操作数的每一位，之后执行位相加。 // //  基本思路：字符串反转、字符变数字、位运算、反序输出 // ////////////////////////////////////////////////////////////////// int Calc(int n,const char* num1,const char * num2,char * result) { 	if (num1 == NULL ||num2 == NULL) 	{ 		return -1; 	} ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 	//反转字符串 字符变数字  	int c = 0; 	char n1[256] = {0}; 	char n2[256] = {0}; 	memset(result,0,256*sizeof(char)); 	int lenA = strlen(num1); 	int lenB = strlen(num2); 	for (int i=0;i<lenA;i++) 	{ 		n1[i] = num1[lenA -i-1]-'0'; 	} 	for(int i=0;i<lenB;i++) 	{ 		n2[i] = num2[lenB -i-1]-'0'; 	} //////////////////////////////////////////////////////////////////////////////////////////////////////////// 	//同位相加 数字串转换成字符串 	for (int i=0;i<lenA||i<lenB;i++) 	{ 		//result[i] = (n1[i]+n2[i]+c)%n+'0';//未位处理 		//进制是2-35的，所以每个位数都有可能超过10，用a-z表示10-34 		if (((n1[i]+n2[i]+c)%n) >= 10) 		{ 			result[i] = (n1[i]+n2[i]+c)%n-10 + 'a'; 		}else 		{ 			result[i] = (n1[i]+n2[i]+c)%n+'0'; 		} 		c = (n1[i] + n2[i] +c)/n;//获取进位信息  	} 	if (c>0)//如果有进位，自己试图手动给字符串进位。 	{ 		int k = lenA>lenB?lenA:lenB; 		result[k] = c +'0'; 	} 	int len =strlen(result); 	int i =0; 	int j=0; 	for (i=len -1;result[i]==0;i--) 	{ 		; 	} 	cout<<"结果是:"; 	for (j=i;j>=0;j--) 	{ 		cout<<result[j]; 	} 	cout<<endl; 	return 0; } int main() { 	char num1[256]; 	char num2[256]; 	int n; 	char resul[256]; 	cout<<"输入进制："; 	cin>>n; 	cout<<endl; 	cout<<"加数："; 	cin>>num1; 	cout<<endl; 	cout<<"被加数:"; 	cin>>num2; 	cout<<endl; 	Calc(n,num1,num2,resul); 	return 0; }

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110 赵4老师，等了你好久了。哇哈哈！

user: user-3
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

user: user-4
content: 大数加法，注意好进位，尤其是最高位上的进位，有可能会buffer（或者数组）大小不足，申请内存时应该+1

user: user-5
content: 其实就是大数相加，明白了加法器的工作原理，这种题怎么作都不怕