大数加法的实现

abaloon 2012-12-11 02:37:44
自己写了一个大数相加的程序,
程序可以运行,但是遇到如下问题,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define DIGIT 100

char * AddOperation( char * a1, char * a2 )
{
int next = 0;
int i = 0;
int count1 = strlen( a1 );
int count2 = strlen( a2 );

char result[ DIGIT ];

while( *a1 != '\0' )
a1 ++;
while( *a2 != '\0' )
a2 ++;

a1 --;
a2 --;

while( ( count1 > 0 ) && ( count2 > 0 ) )
{
if( ( * a1 - 48 ) + ( * a2 - 48 ) + next > 9 )
{
result[ i ] = (char)( ( * a1 - 48 ) + ( * a2 - 48 ) + next - 10 ) + '0';
next = 1;
}
else
{
result[ i ] = (char)( ( * a1 - 48 ) + ( * a2 - 48 ) + next ) + '0';
next = 0;
}


count1 --;
a1 --;
count2 --;
a2 --;
i ++;
}

while( count1 > 0 )
{
if( ( * a1 - 48 ) + next > 9 )
{
result[ i ] = (char)( ( * a1 - 48 ) + next - 10 ) + '0';
next = 1;
}
else
{
result[ i ] = (char)( ( * a1 - 48 ) + next ) + '0';
next = 0;
}
count1 --;
a1 --;
i ++;
}

while( count2 > 0 )
{
if( ( * a2 - 48 ) + next > 9 )
{
result[ i ] = (char)( ( * a2 - 48 ) + next - 10 ) + '0';
next = 1;
}
else
{
result[ i ] = (char)( ( * a2 - 48 ) + next ) + '0';
next = 0;
}

count2 --;
a2 --;
i ++;
}

result[ i ] = '\0';

for( i = strlen( result ) - 1; i >= 0; i-- )
printf( "%c", result[ i ] );
printf( "\n" );
//printf( "%s\n", result );

return result;
}

int main( void )
{
char * add1;
char * add2;
char * result;

char adder1[ DIGIT ];
char adder2[ DIGIT ];

puts( "Please input adder1" );
add1 = gets_s( adder1, 100 );

puts( "Please input adder2" );
add2 = gets_s( adder2, 100 );

printf( "The result of %s + %s is\n", add1, add2 );

result = AddOperation( add1, add2 );
//printf( "%s\n", result );
system( "pause" );
return 0;
}

如果在主函数中通过注释掉的这一行来输出的话,当输入的加数位数大于3位时,会出现乱码情况,请问为什么?
目前是反向输出,还没改。
...全文
420 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
未来狠遥远 2012-12-14
  • 打赏
  • 举报
回复
多大的数字 计算机计算不出来啊 ? 需要这样吗 ?
未来狠遥远 2012-12-14
  • 打赏
  • 举报
回复
弱弱的问一句这个程序想说明说明问题?
abaloon 2012-12-14
  • 打赏
  • 举报
回复
8楼,12楼写的都很好,8楼算法比我的精简,12楼针对我的问题帮我解决。感谢大家积极帮我解决问题哈!
liuyang19890710 2012-12-14
  • 打赏
  • 举报
回复
引用 10 楼 wangqiang3236495 的回复:
弱弱的问一句这个程序想说明说明问题?
你才是真的2
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
引用 13 楼 wind_2008_06_29 的回复:另外,楼主的分要全部给我,不要给那个伪专家,他就会骗人,发的代码在网上到处都能百度到,从来都不去解决别人的问题,只是在乱发无关的东西 可惜我8楼发的代码还真是我的原创!不管你们信不信,反正我是信了!
是你原创的又怎么样,楼主要的是他的代码为什么不行,而不是你为什么大数加法怎么写,没有人不会写大数加法吧
赵4老师 2012-12-14
  • 打赏
  • 举报
回复
引用 13 楼 wind_2008_06_29 的回复:
另外,楼主的分要全部给我,不要给那个伪专家,他就会骗人,发的代码在网上到处都能百度到,从来都不去解决别人的问题,只是在乱发无关的东西
可惜我8楼发的代码还真是我的原创!不管你们信不信,反正我是信了!
  • 打赏
  • 举报
回复
http://blog.csdn.net/wind_2008_06_29/article/details/8293180
  • 打赏
  • 举报
回复
引用 14 楼 derekrose 的回复:
引用 13 楼 wind_2008_06_29 的回复:另外,楼主的分要全部给我,不要给那个伪专家,他就会骗人,发的代码在网上到处都能百度到,从来都不去解决别人的问题,只是在乱发无关的东西 呃,你说的伪专家是谁啊
我在csdn里面一直看到其中一个人回复的内容都一样,压根不看别人问什么就去回答,哎,无语了,就是他们说的那个什么赵老师
derekrose 2012-12-14
  • 打赏
  • 举报
回复
引用 13 楼 wind_2008_06_29 的回复:
另外,楼主的分要全部给我,不要给那个伪专家,他就会骗人,发的代码在网上到处都能百度到,从来都不去解决别人的问题,只是在乱发无关的东西
呃,你说的伪专家是谁啊
  • 打赏
  • 举报
回复
另外,楼主的分要全部给我,不要给那个伪专家,他就会骗人,发的代码在网上到处都能百度到,从来都不去解决别人的问题,只是在乱发无关的东西
  • 打赏
  • 举报
回复
问题的本质在以下代码中:

char result[ DIGIT ];
......
return result;
result是stack上的内在,返回之后没了,自然乱码,另外,你的那个代码也没考虑最后也进位的情况,比如9999+1,显然结果是10000,你没考虑最后的一次进位 全部改正之后代码基本如下:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define DIGIT 100

//返回result记得free
char * AddOperation( char * a1, char * a2 )
{
    int next = 0;
    int i = 0;
    int count1 = strlen( a1 );
    int count2 = strlen( a2 );
    
    char* result = new char[DIGIT];
    
    while( *a1 != '\0' )
        a1 ++;
    while( *a2 != '\0' )
        a2 ++;
    
    a1 --;
    a2 --;
    
    while( ( count1 > 0 ) && ( count2 > 0 ) )
    {
        if( ( * a1 - 48 ) + ( * a2 - 48 ) + next > 9 )
        {
            result[ i ] = (char)( ( * a1 - 48 ) + ( * a2 - 48 ) + next - 10 ) + '0';
            next = 1;
        }
        else
        {
            result[ i ] = (char)( ( * a1 - 48 ) + ( * a2 - 48 ) + next ) + '0';
            next = 0;
        }
        
        
        count1 --;
        a1 --;
        count2 --;
        a2 --;
        i ++;
    }
    
    while( count1 > 0 )
    {
        if( ( * a1 - 48 ) + next > 9 )
        {
            result[ i ] = (char)( ( * a1 - 48 ) + next - 10 ) + '0';
            next = 1;
        }
        else
        {
            result[ i ] = (char)( ( * a1 - 48 ) + next ) + '0';
            next = 0;
        }
        count1 --;
        a1 --;
        i ++;
    }
    
    while( count2 > 0 )
    {
        if( ( * a2 - 48 ) + next > 9 )
        {
            result[ i ] = (char)( ( * a2 - 48 ) + next - 10 ) + '0';
            next = 1;
        }
        else
        {
            result[ i ] = (char)( ( * a2 - 48 ) + next ) + '0';
            next = 0;
        }
        
        count2 --;
        a2 --;
        i ++;
    }
    if(next){
        result[i++]='1';
    }
    result[ i ] = '\0';
    return result;
}

int main( void )
{
    char adder1[ DIGIT ];
    char adder2[ DIGIT ];
    
    puts( "Please input adder1" );
    scanf("%s",adder1);
    
    puts( "Please input adder2" );
    scanf("%s", adder2);
    
    printf( "The result of %s + %s is %s\n", adder1, adder2, AddOperation(adder1, adder2));
    
    return 0;
}
abaloon 2012-12-13
  • 打赏
  • 举报
回复
请问zhao4zhong1,您代码的输出部分的for循环的起始条件应该是 for ( i = strlen( v3 ) - 1; i >= 0; i-- ) 不一定我输入的加数字符占满了整个数组吧? 数组中没有被占据的部分应该是NULL吧
proorck6 2012-12-13
  • 打赏
  • 举报
回复
没有看到结构体,不太好 这个功能最好用C++的类来实现,使用运算符重载,调用的时候方便一些。
BigInt& BigInt::operator+(BigInt & b);
hotdingyang23 2012-12-13
  • 打赏
  • 举报
回复
二楼的方法也是不妥的,调用完成以后栈空间会释放,返回指针应该也没用!可以malloc一块堆空间,然后返回这个指针,在主函数中输出后记得释放掉堆空间!此方法不建议使用,如果代码量大了,忘记释放堆空间,很容易造成内存泄露,还是在子函数中输出吧!
abaloon 2012-12-13
  • 打赏
  • 举报
回复
我还是不太明白,返回的result应该是指向局部变量result[ 0 ]的地址吧?你的意思是假如我result数组中只存入了10个值,从result[10]-result[99]的内存都会被释放吗?
赵4老师 2012-12-13
  • 打赏
  • 举报
回复
仅供参考
#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
盛夏 2012-12-13
  • 打赏
  • 举报
回复
我建议传一个有足够空间的地址进去,操作此地址来达到返回的效果
盛夏 2012-12-13
  • 打赏
  • 举报
回复
你这个result是个局部数组变量,在函数结束时就被释放掉了,那块内存区域属于空白区域,当你输出返回的指针时,理所当然输出的是看不懂的乱码
hznat 2012-12-11
  • 打赏
  • 举报
回复
你可以在函数AddOperation定义一个char* 变量。 然后用这个变量指向result字符数组。然后返回这个指针。
hznat 2012-12-11
  • 打赏
  • 举报
回复
AddOperation( add1, add2 ); 返回是一个指向局部变量的地址,函数返回值能得到的仅仅是这个地址的值。 后面的内存都已经释放。如果没有其他程序干扰,得到原始有值的值+乱码。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧