| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 597 人关注过本帖
标题:关于大数相加的问题 求修改方案
只看楼主 加入收藏
lisjdf
Rank: 1
等 级:新手上路
帖 子:12
专家分:6
注 册:2012-7-26
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
关于大数相加的问题 求修改方案
#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000],b[1000];
    int num[1100];
    int n,i,j,a1[1100],b1[1100],t,k;
    scanf("%d",&n);     //输入测试样例数
      for(k=1;k<=n;k++)
       { scanf("%s",a);   //读入测试两个大数
         scanf("%s",b);
               int a1=strlen(a);
                  for(j=0,i=a1-1;i>=0;i--)
                   a1[j++]=a[i]-'0';
               int b1=strlen(b);
                  for(j=0,i=b1-1;i>=0;i--)
                   b1[j++]=b[i]-'0';
             for(i=0;i<1000;i++)   
                  {
                        a1[i]+=b1[i];   //a1[i]计算得出大数和
                         if(a1[i]>=10)
                           a1[i]-=10;
                           a1[i+1]++;  //位数大于10则进位
                  }
               printf("Case 1:\n");      //输出 Case 1:   a + b =
               printf("%s + %s = ",a,b);
            
               for(i=1100;(i>=0)&&(a1[i]==0);i--);// 从高位到低位跳过高位的0
                    if(i>=0)
                     for(;i>=0;i--)
                      printf("%d",a1[i]);
                     else printf("0");
                        printf("\n\n");
      
 
       }
         return 0;
 
}
 
提示

--------------------Configuration: 1 - Win32 Debug--------------------
Compiling...
1.c
K:\计算机\VC6.0\Microsoft Visual Studio\MyProjects\数组实验\1.c(12) : error C2143: syntax error : missing ';' before 'type'
K:\计算机\VC6.0\Microsoft Visual Studio\MyProjects\数组实验\1.c(13) : warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
K:\计算机\VC6.0\Microsoft Visual Studio\MyProjects\数组实验\1.c(15) : error C2143: syntax error : missing ';' before 'type'
K:\计算机\VC6.0\Microsoft Visual Studio\MyProjects\数组实验\1.c(16) : warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
执行 cl.exe 时出错.

1.obj - 1 error(s), 0 warning(s)

表示不会修改了
搜索更多相关主题的帖子: include 
2012-07-26 15:06
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:20 
#include<stdio.h>
#include<string.h>
int main()
{
     char a[1000],b[1000];
     int num[1100];
     int n,i,j,a1[1100],b1[1100],t,k;
     scanf("%d",&n);     //输入测试样例数
     for(k=1;k<=n;k++)
     {
           for (i=0;i<1100;i++)  //加数被加数各位置零
           {
               a1[i]=0;
               b1[i]=0;
           }
           scanf("%s",a);   //读入测试两个大数
           scanf("%s",b);
           int al=strlen(a);    //倒序将各位赋值
           for(j=0,i=al-1;i>=0;i--)
              a1[j++]=a[i]-'0';
           int bl=strlen(b);
           for(j=0,i=bl-1;i>=0;i--)
              b1[j++]=b[i]-'0';
           for(i=0;i<1100;i++)   
           {
               a1[i]+=b1[i];   //a1[i]计算得出大数和
               if(a1[i]>=10)
               {
                   a1[i+1]+=a1[i]/10;  //位数大于10则进位
                   a1[i]%=10;
               }
           }
           printf("Case 1:\n");      //输出 Case 1:   a + b =
           printf("%s + %s = ",a,b);
           for(i=1100-1;i>=0;i--)    // 从高位到低位跳过高位的0
               if (a1[i])
                  break;
           for (;i>=0;i--)
               printf("%d",a1[i]);
     }
     return 0;
}
2012-07-26 15:41
lisjdf
Rank: 1
等 级:新手上路
帖 子:12
专家分:6
注 册:2012-7-26
收藏
得分:0 
以下是引用stophin在2012-7-26 15:41:54的发言:

#include<stdio.h>
#include<string.h>
int main()
{
     char a[1000],b[1000];
     int num[1100];
     int n,i,j,a1[1100],b1[1100],t,k;
     scanf("%d",&n);     //输入测试样例数
     for(k=1;k<=n;k++)
     {
           for (i=0;i<1100;i++)  //加数被加数各位置零
           {
               a1=0;
               b1=0;
           }
           scanf("%s",a);   //读入测试两个大数
           scanf("%s",b);
           int al=strlen(a);    //倒序将各位赋值
           for(j=0,i=al-1;i>=0;i--)
              a1[j++]=a-'0';
           int bl=strlen(b);
           for(j=0,i=bl-1;i>=0;i--)
              b1[j++]=b-'0';
           for(i=0;i<1100;i++)   
           {
               a1+=b1;   //a1计算得出大数和
               if(a1>=10)
               {
                   a1+=a1/10;  //位数大于10则进位
                   a1%=10;
               }
           }
           printf("Case 1:\n");      //输出 Case 1:   a + b =
           printf("%s + %s = ",a,b);
           for(i=1100-1;i>=0;i--)    // 从高位到低位跳过高位的0
               if (a1)
                  break;
           for (;i>=0;i--)
               printf("%d",a1);
     }
     return 0;
}



依然没有通过编译
--------------------Configuration: 大数加法 - Win32 Debug--------------------
Compiling...
大数加法.c
D:\C++\大数加法.c(18) : error C2143: syntax error : missing ';' before 'type'
D:\C++\大数加法.c(19) : error C2065: 'al' : undeclared identifier
D:\C++\大数加法.c(21) : error C2143: syntax error : missing ';' before 'type'
D:\C++\大数加法.c(22) : error C2065: 'bl' : undeclared identifier
执行 cl.exe 时出错.

大数加法.obj - 1 error(s), 0 warning(s)
________________________________________________________________
这是最简化的
#include <stdio.h>
#include <string.h>
#define MAX_LEN 200
int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main(void)
{
    scanf("%s", szLine1);
    scanf("%s", szLine2);
    int i, j;
    int nLen1 = strlen( szLine1);
    for( j = 0, i = nLen1 - 1;i >= 0 ; i --)
        an1[j++] = szLine1[i] - '0';
    int nLen2 = strlen(szLine2);
    for( j = 0, i = nLen2 - 1;i >= 0 ; i --)
        an2[j++] = szLine2[i] - '0';
    for( i = 0;i < MAX_LEN ; i ++ )
    {  an1[i] += an2[i]; //逐位相加
        if( an1[i] >= 10 )
        { //看是否要进位
            an1[i] -= 10;
            an1[i+1] ++; //进位
        }
    }
    for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;
    if(i>=0)
        for( ; i >= 0; i--)
            printf("%d", an1[i]);
    else      printf("0");
    return 0;
}
2012-07-26 15:47
lisjdf
Rank: 1
等 级:新手上路
帖 子:12
专家分:6
注 册:2012-7-26
收藏
得分:0 
以下是引用stophin在2012-7-26 15:41:54的发言:

#include<stdio.h>
#include<string.h>
int main()
{
     char a[1000],b[1000];
     int num[1100];
     int n,i,j,a1[1100],b1[1100],t,k;
     scanf("%d",&n);     //输入测试样例数
     for(k=1;k<=n;k++)
     {
           for (i=0;i<1100;i++)  //加数被加数各位置零
           {
               a1=0;
               b1=0;
           }
           scanf("%s",a);   //读入测试两个大数
           scanf("%s",b);
           int al=strlen(a);    //倒序将各位赋值
           for(j=0,i=al-1;i>=0;i--)
              a1[j++]=a-'0';
           int bl=strlen(b);
           for(j=0,i=bl-1;i>=0;i--)
              b1[j++]=b-'0';
           for(i=0;i<1100;i++)   
           {
               a1+=b1;   //a1计算得出大数和
               if(a1>=10)
               {
                   a1+=a1/10;  //位数大于10则进位
                   a1%=10;
               }
           }
           printf("Case 1:\n");      //输出 Case 1:   a + b =
           printf("%s + %s = ",a,b);
           for(i=1100-1;i>=0;i--)    // 从高位到低位跳过高位的0
               if (a1)
                  break;
           for (;i>=0;i--)
               printf("%d",a1);
     }
     return 0;
}

老实说BUG在这里

for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;
    if(i>=0)
        for( ; i >= 0; i--)
            printf("%d", an1[i]);
    else      printf("0");
2012-07-26 15:49
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
楼主说依然没有通过编译,错误是al、bl没有定义,但是程序中al是在这个注释"//倒序将各位赋值"那儿定义的,bl是在下面定义的。
还是说lz的编译器不支持中间定义变量一定要在开头定义?那把al、bl定义放到开头试试?我用vc6.0是可以运行出正确答案的。
楼主1楼的程序strlen那儿应该是al和bl,而不是a1和b1。
另外楼主说的bug:
最简版程序中an1定义为:
int an1[MAX_LEN+10];
打印时为:
for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;
if(i>=0)
   for( ; i >= 0; i--)
printf("%d", an1[i]);
   else printf("0");
而楼主写的程序中a1定义为:
int a1[1100];
打印时为           
for(i=1100;(i>=0)&&(a1[i]==0);i--);// 从高位到低位跳过高位的0
if(i>=0)
  for(;i>=0;i--)
printf("%d",a1[i]);
else printf("0");
  printf("\n\n");
楼主有没有想过当i取1100时a1[i]会越界呢?此时a1[i]等不等于0是不确定的,可能循环未开始就结束了


[ 本帖最后由 stophin 于 2012-7-26 16:43 编辑 ]
2012-07-26 16:36
lisjdf
Rank: 1
等 级:新手上路
帖 子:12
专家分:6
注 册:2012-7-26
收藏
得分:0 
以下是引用stophin在2012-7-26 16:36:56的发言:

楼主说依然没有通过编译,错误是al、bl没有定义,但是程序中al是在这个注释"//倒序将各位赋值"那儿定义的,bl是在下面定义的。
还是说lz的编译器不支持中间定义变量一定要在开头定义?那把al、bl定义放到开头试试?我用vc6.0是可以运行出正确答案的。
楼主1楼的程序strlen那儿应该是al和bl,而不是a1和b1。
另外楼主说的bug:
最简版程序中an1定义为:
int an1[MAX_LEN+10];
打印时为:
for( i = MAX_LEN; (i >= 0) && (an1 == 0); i -- ) ;
if(i>=0)
   for( ; i >= 0; i--)
printf("%d", an1);
   else printf("0");
而楼主写的程序中a1定义为:
int a1[1100];
打印时为           
for(i=1100;(i>=0)&&(a1==0);i--);// 从高位到低位跳过高位的0
if(i>=0)
  for(;i>=0;i--)
printf("%d",a1);
else printf("0");
  printf("\n\n");
楼主有没有想过当i取1100时a1会越界呢?此时a1等不等于0是不确定的,可能循环未开始就结束了

我也是用VC++6.0
1L是做北大ACM1002题编写的1000位以内大数加法
为了达到
Case 1:
x + y = z

Case 2:
x + y = Z
这种效果
我编写成

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1100],b[1100];
    int num[1100];
    int n,i,j,a1[1100],b1[1100],t,k,a2,b2;                           //为区分源代码a1和a1[]把a1,b1用a2,b2代替
    scanf("%d",&n);     //输入测试样例数
      for(k=1;k<=n;k++)
       { scanf("%s",a);   //读入测试两个大数
         scanf("%s",b);
                    a2=strlen(a);                                    //为区分源代码a1和a1[]把a1,b1用a2,b2代替
                  for(j=0,i=a2-1;i>=0;i--)
                   a1[j++]=a[i]-'0';
                    b2=strlen(b);                                   //为区分源代码a1和a1[]把a1,b1用a2,b2代替
                  for(j=0,i=b2-1;i>=0;i--)
                   b1[j++]=b[i]-'0';
             for(i=0;i<1100;i++)                                     //避免a1[]溢出
                  {
                        a1[i]+=b1[i];   //a1[i]计算得出大数和
                         if(a1[i]>=10)
                           a1[i]-=10;
                           a1[i+1]++;  //位数大于10则进位
                  }
               printf("Case 1:\n");      //输出 Case 1:   a + b =
               printf("%s + %s = ",a,b);
            
               for(i=1100;(i>=0)&&(a1[i]==0);i--);// 从高位到低位跳过高位的0
                    if(i>=0)
                     for(;i>=0;i--)
                      printf("%d",a1[i]);
                     else printf("0");
                        printf("\n\n");
      

       }
         return 0;

}
编译和组建通过了 但是输入1回车1 2回车。运行后会出现1 + 2=2-1717986919-1717986919-1717986919-1717986919循环。。这怎么回事呢。
下面回的精简版是老师PPT上布置的作业让我找BUG
2012-07-26 17:04
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:0 
原来是这样啊,有三处错误,
一是在打印时使用1100-1而不是1100,防止数组越界
二是在k的循环开始处需要加上初始化           
for (i=0;i<1100;i++)
{
     a1[i]=0;
     b1[i]=0;
 }
另外位数大于10处有错误,应该加上大括号                        
if(a1[i]>=10)
{
     a1[i]-=10;
     a1[i+1]++;  //位数大于10则进位
}
程序变成这样
 #include<stdio.h>
 #include<string.h>
 int main()
 {
     char a[1100],b[1100];
     int num[1100];
     int n,i,j,a1[1100],b1[1100],t,k,a2,b2;                           //为区分源代码a1和a1[]把a1,b1用a2,b2代替
     scanf("%d",&n);     //输入测试样例数
       for(k=1;k<=n;k++)
        {
           for (i=0;i<1100;i++)
           {
               a1[i]=0;
               b1[i]=0;
           }
           scanf("%s",a);   //读入测试两个大数
           scanf("%s",b);
                     a2=strlen(a);                                    //为区分源代码a1和a1[]把a1,b1用a2,b2代替
                   for(j=0,i=a2-1;i>=0;i--)
                    a1[j++]=a[i]-'0';
                     b2=strlen(b);                                   //为区分源代码a1和a1[]把a1,b1用a2,b2代替
                   for(j=0,i=b2-1;i>=0;i--)
                    b1[j++]=b[i]-'0';
              for(i=0;i<1100;i++)                                     //避免a1[]溢出
                   {
                        a1[i]+=b1[i];   //a1[i]计算得出大数和
                          if(a1[i]>=10)
                          {
                            a1[i]-=10;
                            a1[i+1]++;  //位数大于10则进位
                          }
                   }
                printf("Case 1:\n");      //输出 Case 1:   a + b =
               printf("%s + %s = ",a,b);
                for(i=1100-1;(i>=0)&&(a1[i]==0);i--);// 从高位到低位跳过高位的0
                     if(i>=0)
                      for(;i>=0;i--)
                       printf("%d",a1[i]);
                      else printf("0");
                         printf("\n\n");
       }
          return 0;
}


[ 本帖最后由 stophin 于 2012-7-27 09:52 编辑 ]
收到的鲜花
  • lisjdf2012-07-28 10:36 送鲜花  3朵   附言:好文章
2012-07-27 09:50
lisjdf
Rank: 1
等 级:新手上路
帖 子:12
专家分:6
注 册:2012-7-26
收藏
得分:0 
回复 7楼 stophin
哎呀 懂了 太谢谢你了
这么多次帮我指出错误改正
2012-07-28 10:36
快速回复:关于大数相加的问题 求修改方案
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028292 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved