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;







}

 

posted @ 2021-01-31 14:58  huxiaojie  阅读(44)  评论(0编辑  收藏  举报