鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 任意长度的大数加法(栈的应用)

  [复制链接]
发表于 2016-7-21 16:15:08 | 显示全部楼层
123333333333333
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-4 22:17:17 From FishC Mobile | 显示全部楼层
我来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-8 10:49:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-10 14:00:44 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-30 14:48:27 | 显示全部楼层
感觉很6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-31 22:24:02 | 显示全部楼层
写了三个while,感觉复杂度有些高,不知对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-16 09:57:55 | 显示全部楼层
我写的感觉好复杂用了三个stack
#include<iostream>

using namespace std;


const int STOCK_SIZE = 100;//定义栈的大小  

template<class DataType>
class DSStack
{
public:
        DSStack(DataType[], int);
        DSStack();
        ~DSStack();
        void Push(DataType data);
        DataType Pop();
        void Clear();
        void Print();
        DataType GetTopData();
private:
        DataType elem[STOCK_SIZE];
        DataType *top;
        DataType *bottom;
        int Count;
};

template<class DataType>
DSStack<DataType>::DSStack(DataType data[], int len)
{
        bottom = elem;  // 栈底初始指向
        top = bottom;   // 初始栈底与栈顶指针指向相同的位置
        for (int i = 1; i <= len; i++)
        {
                elem[i] = data[i];
                Count++;
        }
}

template<class DataType>
DSStack<DataType>::DSStack()
{
        bottom = elem;  // 栈底初始指向
        top = bottom;   // 初始栈底与栈顶指针指向相同的位置
        Count = 0;
}

template<class DataType>
DSStack<DataType>::~DSStack()
{
}

template<class DataType>
void DSStack<DataType>::Push(DataType data)
{
        if (Count > STOCK_SIZE) return;
        Count++;
        elem[Count] = data;
}

template<class DataType>
DataType DSStack<DataType>::Pop()
{
        if (Count < 1)  return -1;
        DataType data;
        data = elem[Count];
        Count--;
        return data;
}

template<class DataType>
void DSStack<DataType>::Clear()
{
        top = bottom;
        Count = 0;
}

template<class DataType>
void DSStack<DataType>::Print()
{
        cout << "栈的数据: " << endl;
        for (int i = 1; i <= Count; i++)
        {
                cout << " " << elem[i] << endl;
        }
}

template<class DataType>
DataType DSStack<DataType>::GetTopData()
{
        if (Count == 0) return -1;
        return elem[Count];
}

void main()
{
        DSStack<char> *stack_addend = new DSStack<char>();
        DSStack<char> *stack_augend = new DSStack<char>();
        DSStack<int> *stack_retult = new DSStack<int>();

        cout << "请输入加数以#结束" << endl;
        char s = ' ';
        cin >> s;
        while (s != '#')
        {
                stack_addend->Push(s);
                cin >> s;
        }
        stack_addend->Print();

        cout << "请输入被加数以#结束" << endl;
        s = ' ';
        cin >> s;
        while (s != '#')
        {
                stack_augend->Push(s);
                cin >> s;
        }
        stack_augend->Print();
        bool is_carry = false;  // 是否进位
        while ((stack_addend->GetTopData() != -1) || (stack_augend->GetTopData() != -1) || is_carry)
        {
                
                // 考虑到两个数的位数不一定相等,把没有的弄为0
                if (stack_addend->GetTopData() == -1)
                {
                        stack_addend->Pop();
                        stack_addend->Push(48);  
                }
                if (stack_augend->GetTopData() == -1)
                {
                        stack_augend->Pop();
                        stack_augend->Push(48);
                }

                char addend = stack_addend->Pop();
                char augend = stack_augend->Pop();

                int result = 0;
                if (is_carry)
                {
                        result = ((int)addend - 48) + ((int)augend - 48) + 1;
                        is_carry = false;
                }
                else
                {
                        result = ((int)addend - 48) + ((int)augend - 48);
                }
                
                if (result >= 10) // 如果的出来的结果是两位数
                {
                        int temp = result % 10;
                        stack_retult->Push(temp);
                        is_carry = true;
                        //stack_retult->Push(result / 10);
                }
                else
                {
                        stack_retult->Push(result);
                }
                
        }

        stack_retult->Print();
        getchar();
        getchar();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-1 02:31:53 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-20 21:57:14 | 显示全部楼层
啊师傅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2017-8-25 15:21:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-25 21:27:53 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-18 08:03:19 | 显示全部楼层
谢谢小甲鱼老师啊啊啊啊啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-26 09:58:21 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-26 16:44:38 From FishC Mobile | 显示全部楼层
对答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-15 22:32:59 | 显示全部楼层
学习学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-23 12:00:05 | 显示全部楼层
a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-30 11:15:20 | 显示全部楼层
就能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-3 09:29:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-3 10:57:28 | 显示全部楼层
carry是char型的,但赋值时carry = 0,可以将整形数据赋值给字符型吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-3 10:58:25 | 显示全部楼层
谁参照它编一个减法器、乘法器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表