DraculaW

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  19 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
#ifndef _BIGNUM_HPP_
#define _BIGNUM_HPP_

#include <vector>
#include <string>
#include <iostream>

using namespace std;

class BigNum;

BigNum operator+(const BigNum& lhs, const BigNum& rhs);

ostream& operator<<(ostream& os, const BigNum& rhs);

void Add(const BigNum& lhs, const BigNum& rhs, BigNum& res);

class BigNum
{
public:
    BigNum(int n) : value(n){}
    BigNum(const string& s);
    friend BigNum operator+(const BigNum& lhs, const BigNum& rhs);
    friend ostream& operator<<(ostream& os, const BigNum& rhs);
    friend void Add(const BigNum& lhs, const BigNum& rhs, BigNum& res);
private:
    vector<char> value;   
};

#endif

#include "BigNum.hpp"

BigNum::BigNum(const string& s):value(s.length())
{
    int j = value.size();
    for(string::const_iterator it = s.begin(); it != s.end(); it++)
    {
        j--;       
        value[j] = *it;
    }
}

ostream& operator<<(ostream& os, const BigNum& rhs)
{
    size_t i = rhs.value.size();
    bool zero = false;
    if( i == 1)
        return os << rhs.value[0];

    if(rhs.value[ i - 1 ] == '0')
        zero = true;
   
    while( i > 0 )
    {
        i--;
        while(zero == true)
        {
            i--;
            if(rhs.value[i] != '0')
                zero = false;
        }
        os << rhs.value[i];
    }
    return os;
}

void Add(const BigNum& lhs, const BigNum& rhs, BigNum& res)
{
    int carry = 0;
    char c = 0;
    char tmp = 0;
    size_t i = 0;
    for( ; i < rhs.value.size(); i++)
    {
        tmp = lhs.value[i] + rhs.value[i] + carry - '0';

        if( tmp > '9' )
        {
            carry = 1;
            tmp -= 10;
        }
        else
        {
            carry = 0;
        }
        res.value[i] = tmp;
    }

    while( carry != 0 && i < lhs.value.size() )
    {
        tmp = lhs.value[i] + carry;
        if( tmp > '9' )
        {
            carry = 1;
            tmp = '0';
        }
        else
        {
            carry = 0;
        }
        res.value[i] = tmp;
        i++;
    }

    if( carry > 0)
        res.value[i] = '1';

}

BigNum operator+(const BigNum& lhs, const BigNum& rhs)
{
    size_t lsize, rsize;
    lsize = lhs.value.size();
           rsize = rhs.value.size();
    size_t n = lsize > rsize ? lsize : rsize;   
    BigNum res(n + 1);
    res.value[0] = '0';
   
    if( lsize > rsize )
    {
             Add(lhs, rhs, res);
    }
    else
    {
        Add(rhs, lhs, res);
    }
   
    return res;
}

//我自己实现的大数的加法的程序。。 终于验证可以使用了 呵呵
这个程序写好了 也算可以了了我的心愿了的
去年的某个时候 在杭州的UT斯达康面试 上机题就是这一道 我死活没有憋出来,当时就很后悔 为什么不好好的看看论坛上的帖子 对上面的问题做做呢?那样子的话 也许我就不会这么悲惨了,老是在哪里自怨自唉。
总结起来 我其实是眼高手低,然后从来都被宠着没有认清过自己。小学初中,老妈老师都说我数学学的还不错,其实是有点小聪明,分数还是那么可怜的一点点;到高中,因 为学校比较一般,考的名次看起来很美,被假象迷惑了;大学,因为自己有点基础,被给哥封为软件最好,也有点沾沾自喜;到了这个公司,也许因为我身体的原 因,也有点面试时做题速度超快的原因,被经理说我程序不错,还是没有摆正自己的位子。
受点挫折才好。嗯
呵呵, 心态 , 心态才是一切。
不要眼高手低
posted on 2007-11-15 20:35 DraculaW 阅读(191) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理