none
两个N位数相加 RRS feed

  • 问题

  • #include<iostream>
    #include<string>
    int main()
    {  
     using namespace std;
     string a,b;
            //用来保存要申请的的个数
       //       cout<<"要多少位数相加(相加数的位数不能小于些值) :";
    // cin>>size2;    
     cout<<endl<<"输入数字A:";
     cin>>a;
     cout<<"输入数字B:";
     cin>>b;
     int dh/*用来保存A B中每位数相加的和*/
      ,yu=0/*用来保存要进位的值*/
      ,az=a.size()-1,bz=b.size()-1;/*测量A B字符串的长度 减1是为了从\0的前一位开始*/
     cout<<az<<","<<bz;
     int bjab=az>bz?az:bz;//计算出a b两个字符串那个长
        
     char *p=new char[bjab+2];   //申请空间,用来存放最后的和
     if(p==NULL)
     {
      cout<<"内存空间不够 ";
      return 0;
     }
        int i=0,vc=0,k=0,jl=0;
     for(i;i<=bjab+2;i++)
     {
      
      if(!(a[az]>='0'&&a[az]<='9'&&b[bz]>='0'&&b[bz]<='9'))
      {
       cout<<endl<<"你输入的数字中有非法字符! 程序将退出"<<endl;
          delete []p;
       exit(1);
      
      }
      dh=(a[az]-'0')+(b[bz]-'0');   //将a b中的每一位字符转换成数字后相加
            p[vc++]=((dh+yu)%10)+'0';     //保存 dh中和个位数
         if(dh+yu==10) yu=1;           //用来除去如果dh等于9 yu等于1时没余数的情况
      else yu=dh/10;            

       
      if(az==0) a[az]='0';        //当a 字符串比b短时,比b短的地方补0
            else   az--;             
      if(bz==0) b[bz]='0';         //同上
      else     bz--;
     }

         cout<<endl<<"数字A的长度为:"
       <<a.size()<<endl<<"数字B的长度为:"
       <<b.size()<<endl;
     cout<<endl<<"A+B=";
     if(p[vc-1]=='0'&&p[vc-2]=='0')  k=vc-3;  //除去没有进位时前面有0的情况
     else if(p[vc-1]='0') k=vc-2;
     else  k=vc ;
        for(k;k>=0;k--)                          //从后面往前输出字符
       cout<<p[k];
        cout<<endl; 
          //delete []p;     ///不知道这里为什么在vc 6.0中会有错误
     return 0;
    }

    • 已编辑 Wyz_Touring 2009年10月16日 11:05 //delete []p; ///不知道这里为什么在vc 6.0中会有错误
    2009年10月16日 11:04

答案

  • 突然的停网让我终于把这个问题解决了,哎,都是由于我的粗心造成的。
    #include<iostream>
    #include<string>
    int main()
    {  
     using namespace std;
     string a,b;
     cout<<endl<<"输入数字A:";
     cin>>a;
     cout<<"输入数字B:";
     cin>>b;
     int dh/*用来保存A B中每位数相加的和*/
      ,yu=0/*用来保存要进位的值*/
      ,az=a.size()-1,bz=b.size()-1;/*测量A B字符串的长度 减1是因为数组从0的开始的*/
     int bjab=az>bz?az:bz;//计算出a b两个字符串那个长
        
      char  *p=new char[bjab+3]; //申请空间,用来存放最后的和
                
     if(p==NULL)
     {
      cout<<"内存空间不够 ";
      return 0;
     }
        int i=0,vc=0,k=0,jl=0;
     for(i;i<=bjab+2;i++)
     {
     
      if(!(a[az]>='0'&&a[az]<='9'&&b[bz]>='0'&&b[bz]<='9'))
      {
       cout<<endl<<"你输入的数字中有非法字符! 程序将退出"<<endl;
          delete []p;
       exit(1);
     
      }
      dh=(a[az]-'0')+(b[bz]-'0');   //将a b中的每一位字符转换成数字后相加
            p[vc++]=((dh+yu)%10)+'0';     //保存 dh中和个位数
         if(dh+yu==10) yu=1;           //用来除去如果dh等于9 yu等于1时没余数的情况
      else yu=dh/10;           

       
      if(az==0) a[az]='0';        //当a 字符串比b短时,比b短的地方补0
            else   az--;             
      if(bz==0) b[bz]='0';         //同上
      else     bz--;
     }
         cout<<endl<<"数字A的长度为:"
       <<a.size()<<endl<<"数字B的长度为:"
       <<b.size()<<endl;
     cout<<endl<<"A+B=";
     if(p[vc-1]=='0'&&p[vc-2]=='0')  k=vc-3;  //除去没有进位时前面有0的情况
     else if(p[vc-1]='0') k=vc-2;
     else
     k=vc-1 ;
        for(k;k>=0;k--)                          //从后面往前输出字符
          cout<<p[k];
        cout<<endl;
          delete []p;    
     return 0;
    }


    这是正常的代吗。由于申请的空间少了一个导致最后的空间删除时,p到了原来的p-1处


    c/c++ 冰冻三尺非一日之寒,为了共同的梦想...........努力........在努力.......成功
    • 已标记为答案 Wyz_Touring 2009年10月17日 15:28
    2009年10月17日 15:26

全部回复

  • 因为你前面开辟空间时候用的是
    char *p=new char[bjab+2];   //申请空间,用来存放最后的和
    bjab是动态计算出来的一个数,那么这个p的大小不明确
    delete 释放的空间是空间大小明确的一个指针空间

    2009年10月17日 9:05
  • 因为你前面开辟空间时候用的是
    char *p=new char[bjab+2];   //申请空间,用来存放最后的和
    bjab是动态计算出来的一个数,那么这个p的大小不明确
    delete 释放的空间是空间大小明确的一个指针空间


     我知道就是这里的问题
     但我觉的你说的不对,使用new就是为了动态开辟空间。
     我试着给一个定值如还是不行
     但在另一人编译器中正常
     如果注释那点就正常了,程序执行到最后如果正常会自动释放堆中内存。
    我想会不会是重复释放造成的。
    c/c++ 冰冻三尺非一日之寒,为了共同的梦想...........努力........在努力.......成功
    2009年10月17日 10:48
  • 突然的停网让我终于把这个问题解决了,哎,都是由于我的粗心造成的。
    #include<iostream>
    #include<string>
    int main()
    {  
     using namespace std;
     string a,b;
     cout<<endl<<"输入数字A:";
     cin>>a;
     cout<<"输入数字B:";
     cin>>b;
     int dh/*用来保存A B中每位数相加的和*/
      ,yu=0/*用来保存要进位的值*/
      ,az=a.size()-1,bz=b.size()-1;/*测量A B字符串的长度 减1是因为数组从0的开始的*/
     int bjab=az>bz?az:bz;//计算出a b两个字符串那个长
        
      char  *p=new char[bjab+3]; //申请空间,用来存放最后的和
                
     if(p==NULL)
     {
      cout<<"内存空间不够 ";
      return 0;
     }
        int i=0,vc=0,k=0,jl=0;
     for(i;i<=bjab+2;i++)
     {
     
      if(!(a[az]>='0'&&a[az]<='9'&&b[bz]>='0'&&b[bz]<='9'))
      {
       cout<<endl<<"你输入的数字中有非法字符! 程序将退出"<<endl;
          delete []p;
       exit(1);
     
      }
      dh=(a[az]-'0')+(b[bz]-'0');   //将a b中的每一位字符转换成数字后相加
            p[vc++]=((dh+yu)%10)+'0';     //保存 dh中和个位数
         if(dh+yu==10) yu=1;           //用来除去如果dh等于9 yu等于1时没余数的情况
      else yu=dh/10;           

       
      if(az==0) a[az]='0';        //当a 字符串比b短时,比b短的地方补0
            else   az--;             
      if(bz==0) b[bz]='0';         //同上
      else     bz--;
     }
         cout<<endl<<"数字A的长度为:"
       <<a.size()<<endl<<"数字B的长度为:"
       <<b.size()<<endl;
     cout<<endl<<"A+B=";
     if(p[vc-1]=='0'&&p[vc-2]=='0')  k=vc-3;  //除去没有进位时前面有0的情况
     else if(p[vc-1]='0') k=vc-2;
     else
     k=vc-1 ;
        for(k;k>=0;k--)                          //从后面往前输出字符
          cout<<p[k];
        cout<<endl;
          delete []p;    
     return 0;
    }


    这是正常的代吗。由于申请的空间少了一个导致最后的空间删除时,p到了原来的p-1处


    c/c++ 冰冻三尺非一日之寒,为了共同的梦想...........努力........在努力.......成功
    • 已标记为答案 Wyz_Touring 2009年10月17日 15:28
    2009年10月17日 15:26