| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2815 人关注过本帖
标题:大位数加法,基础版本
取消只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:9 
大位数加法,基础版本
啥都不说了,写的好拖沓。
还是基础版本,只可以进行2个正数运算,负数计算应该并不困难,细节而已了。

用到了2个栈,但是感觉进位的栈并不是必要的。

BUG1:
在2个数字长度不一致是会出现计算错误,先等等,吃饭之后再说。(目测,已经修正了)

stack.h 可以在置顶贴的 《通用栈》中找到。

程序代码:
#include <stdio.h>
#include <string.h>
#include "d:\mylib\stack.h"
#include "d:\mylib\getstring.h"

void
Add( char Op_1[ static 1 ], char Op_2[ static 1 ], char *Res );//函数并不检查参数的有效性,以及Res是否有足够的空间容纳结果
//如果你的编译器不支持C99或不完全支持导致函数原型通不过编译,改成 void Add( char *Op_1, char *Op_2, char *Res );
 
int
main( void )
{
    char *op1;
    char *op2;
    char res[ 100 ];

    op1 = getstring( stdin );//getstring()改成你能够使用的录入字符串的函数,例如fgets(),但是需要相应的修改 op1将不再是指针,而应该是数组。
    op2 = getstring( stdin );
    Add( op1, op2, res );
    printf( "%s\n", res );
    free( op1 );
    free( op2 );
    return 0;
}


void
Add( char Op_1[ static 1 ], char Op_2[ static 1 ], char *Res )
{//如果你的编译器不支持C99或不完全支持导致函数通不过编译,改成 void Add( char *Op_1, char *Op_2, char *Res );
    register char *op_1;
    register char *op_2;
    char carr, ch_1, ch_2;
    char ch_3;
    Stack_T Carry,Result;

    Carry = CreateStack( sizeof( char ) );
    Result = CreateStack( sizeof( char ) );

    op_1 = Op_1 + strlen( Op_1 );
    op_2 = Op_2 + strlen( Op_2 );
    ch_3 = '\0';
    PoshStack( Result, &ch_3 );

    while( 1 )
    {
        ch_1 = '0';
        ch_2 = '0';
        carr = '0';

        if( ( op_1 == Op_1 && op_2 == Op_2 ) && IsEmptyStack( Carry ) )
            break;
        if( op_1 > Op_1 )
            ch_1 = *--op_1;
        if( op_2 > Op_2 )
            ch_2 = *--op_2;
        if( !IsEmptyStack( Carry ) )
        {
            carr = *( char * )TopStack( Carry );
            PopStack( Carry );
        }

        ch_3 = ( ch_1 - '0' ) + ( ch_2 - '0' ) + ( carr - '0' );

        if( ch_3 >= 10 )
        {
            carr = '1';
            PoshStack( Carry, &carr );
        }

        ch_3 = ( ch_3 % 10 ) + '0';
        PoshStack( Result, &ch_3 );
    }

    while( !IsEmptyStack( Result ) )
    {
        *Res++ = *( char * )TopStack( Result );
        PopStack( Result );
    }

    DestroyStack( Result );
    DestroyStack( Carry );

}



[此贴子已经被作者于2017-5-28 21:00编辑过]

搜索更多相关主题的帖子: void Add char Res Result 
2017-05-28 19:27
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 九转星河
常用啊。
好处,说不清楚。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 19:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 5楼 九转星河
那就是给编译器看的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 19:55
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 5楼 九转星河
C99的,如果编译器不支持,删掉就好,不过需要在形参前面加一个 *

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 19:56
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 九转星河
让编译器优化代码。
可以去掉的。
写成 char *op_1
就可以了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:00
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 九转星河
奇怪了,如果是输入的数字,就会出现计算错误。

这BUG让我有点受不了了。

我靠,原来是输出函数的锅,靠。

[此贴子已经被作者于2017-5-28 20:05编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:02
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 11楼 九转星河
不,我没打算的。( 也要看具体,如果能写完的话,我还是会全部写出来的 )

我只是太久不写代码了,找个题目练练手,怕自己太久不写,忘记怎么写了。

而大位数运算可以运用到我的计算器中,所以就选了这个题目。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:08
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 11楼 九转星河
那个BUG已经被干掉了,那个BUG的产生是我的输入函数的问题。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:09
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 14楼 九转星河
你不需要吧?你几乎每天都写代码。
跟我情况不同。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:50
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 16楼 九转星河
说的也是。
我就是懒,写过一次的东西,除非是想到了新的思路,否则懒得再碰。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-28 20:56
快速回复:大位数加法,基础版本
数据加载中...
 
   



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

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