hduOj1002遇到的知识总结
strlen:一个c/c++的库函数,就是计数函数,即从串头开始,然后到‘\0’为止,不计入'\0'
代码思路:从后往前诸位相加,将大数转化为字符串,然后采取进位,最终结果数比原数字串多一位
#include<iostream> #include<cstring> using namespace std; int main(){ char a[1000]; char b[1001];//第二个字符串存放结果,所以需要大的位数 int case_N;//存放case个数 int length_a; int length_b; char *p_a; char *p_b; char *p_s;//指向第二个串的指针,存放结果 int sum; int flag=0; int i; cin>>case_N; for(i=1;i<=case_N;i++){ flag=0; cout<<"Case "<<i<<":"<<endl; cin>>a>>b; length_a=strlen(a); length_b=strlen(b); p_a=a+length_a-1; p_b=b+length_b-1; cout<<a<<" + "<<b<<" = "; p_s=b+(length_a>length_b?length_a:length_b)+1; *p_s='\0'; p_s--; //计算求和,从各自的个位往前递增相加 while(p_a>=a&&p_b>=b)//如果两个串对应的指针都没有到各自串的第一个位置 { sum=*p_a-'0'+*p_b-'0'+flag; if(sum>=10) { flag=1;//产生进位 *p_s=sum-10+'0'; } else { flag=0; *p_s=sum+'0'; } p_a--; p_b--; p_s--; } if(p_a==a-1){//如果第一传中数字从低位到高位都加完了 while(p_b>=b){//则循环加第二个串中剩下没加的数字,加到字符串中的第一个数字字符 sum=*p_b-'0'+flag; if(sum>=10){ flag=1; *p_s=sum-10+'0'; } else { flag=0; *p_s=sum+'0'; } p_b--; p_s--; } } else{ while(p_a>=a){//如果第二个串中数字从低位到高位都加完了 sum=*p_a-'0'+flag;//把第一个串中剩下没加的数字,加到第二个字符串的第一个数字字符 if(sum>=10) { flag=1; *p_s=sum-10+'0'; }else{ flag=0; *p_s=sum+'0'; } p_a--; p_s--; } } if(flag==0){//最后一次相加没有进位 cout<<p_s+1;//从第二个数组中的第二个位置开始输出,即为求和结果 }else{//如果最后一次相加有进位,则把进位1,存放到第二数组中的第一个位置 *p_s='1'; cout<<p_s; } if(i==case_N){ cout<<endl; } else{ cout<<endl<<endl;//空行展开 } } return 0; }