Logo huzhenyuan的博客

博客

又来(??).hpp?!

2025-07-25 22:01:36 By huzhenyuan

没错,新的.hpp又来了……

(不是哥们,又干啥了?)

点我看Tree~~.hpp: 关于我自己写的Tree.hpp

String_number.hpp

顾名思义,把number(就是int, long long一类的)string保存。

why要写这个看起来就(没)(啥)(用)的.hpp呢?

什么???你不知道???

高精度啊!!bro!!~

You:那高精度又有……

拱出去,谢谢awa~

下面是代码时间~:

#include <string>
#include <unordered_map>
#include <bits/c++config.h>
#include <ostream>
#include <istream>
#include <algorithm>
namespace std
{
    class string_number
    {
    private:
        string num;
        unordered_map<char, int> digit_map;

    public:

#define digit_map_init {{'0', 0}, {'1', 1}, {'2', 2}, {'3', 3}, {'4', 4}, {'5', 5}, {'6', 6}, {'7', 7}, {'8', 8}, {'9', 9}}

        string_number(int num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(unsigned num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(long num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(unsigned long num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(long long num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(unsigned long long num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(float num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(double num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(long double num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(to_string(num)), digit_map(digit_map) {}
        string_number(char num,
                      unordered_map<char, int> digit_map = digit_map_init) : num(string(1, num)), digit_map(digit_map) {}
        string_number(string num = "",
                      unordered_map<char, int> digit_map = digit_map_init) : num(num), digit_map(digit_map) {}
        string_number(size_t n, char c,
                      unordered_map<char, int> digit_map = digit_map_init) : num(string(n, c)), digit_map(digit_map) {}

#undef digit_map_init

        string_number operator=(string_number str_n)
        {
            this->num = str_n.num;
            return *this;
        }
        friend string_number operator+(string_number str_n1, string_number str_n2);
        string_number operator+=(string_number str_n)
        {
            *this = *this + str_n;
            return *this;
        }

        friend ostream &operator<<(ostream &output, string_number str_n);
        friend istream &operator>>(istream &input, string_number &str_n);
    };

    string_number operator+(string_number str_n1, string_number str_n2)
    {
        size_t len1 = str_n1.num.size(), len2 = str_n2.num.size();
        if (len1 > len2)
        {
            swap(str_n1, str_n2);
            swap(len1, len2);
        }
        bool carry = false;
        size_t i = len2 - 1;
        for (; i >= len2 - len1; i--)
        {
            str_n2.num.at(i) += str_n1.num.at(i - len2 + len1) - '0' + carry;
            carry = str_n2.num.at(i) - '0' > 9;
            str_n2.num.at(i) -= carry * 10;
            if (i == 0)
                break;
        }
        while (carry && !(len2 - len1 == 0))
        {
            str_n2.num.at(i)++;
            carry = str_n2.num.at(i) - '0' > 9;
            str_n2.num.at(i) -= carry * 10;
            if (i-- == 0)
                break;
        }
        if (carry)
            str_n2.num = '1' + str_n2.num;
        return str_n2;
    }

    ostream &operator<<(ostream &output, string_number str_n)
    {
        output << str_n.num;
        return output;
    }
    istream &operator>>(istream &input, string_number &str_n)
    {
        input >> str_n.num;
        return input;
    }
}

(悄悄地告诉你:这个加法好出生啊QWQ,写了我半个小时awa~~)

如你所见,只有加法。剩下的还要等等。(毕竟还在写Tree.hpp)

其实是不想写……

新版

上课写的,不说太多。

#include <string>
#include <unordered_map>
#include <bits/c++config.h>
#include <ostream>
#include <istream>
#include <algorithm>

namespace std
{

    class string_number
    {
    public:
        typedef size_t size_type;
        typedef unordered_map<size_type, char> dig_map_type;
        typedef unordered_map<string, char> sym_map_type;

    protected:
        typedef unordered_map<char, size_type> chr_map_type;

    private:
        static const dig_map_type digit_map_init;
        static const sym_map_type symbol_map_init;
        size_t sys;
        string num;
        dig_map_type digit_map;
        sym_map_type symbol_map;

    protected:
        chr_map_type character_map;

    public:
        string_number(string num = "", dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(num), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(int num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(unsigned num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(long num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(unsigned long num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(long long num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(unsigned long long num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(float num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(double num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(long double num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(to_string(num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(char num, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(string(1, num)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }
        string_number(size_t n, char c, dig_map_type digit_map = digit_map_init, sym_map_type symbol_map = symbol_map_init)
            : num(string(n, c)), digit_map(digit_map), symbol_map(symbol_map)
        {
            oper_sys();
        }

        size_type oper_sys()
        {
            character_map.clear();
            for (size_type digit = 0;; digit++)
            {
                dig_map_type::iterator iter = digit_map.find(digit);
                if (iter != digit_map.end())
                    character_map.insert({iter->second, iter->first});
                else
                {
                    sys = digit;
                    break;
                }
            }
            return sys;
        }

        size_type length()
        {
            return num.size();
        }

        friend string_number operator+(string_number str_n1, string_number str_n2);

        string_number operator=(string_number str_n)
        {
            this->num = str_n.num;
            return *this;
        }
        string_number operator+=(string_number str_n)
        {
            *this = *this + str_n;
            return *this;
        }

        friend ostream &operator<<(ostream &output, string_number str_n);
        friend istream &operator>>(istream &input, string_number &str_n);
    };
    const string_number::dig_map_type string_number::digit_map_init =
        {{0, '0'}, {1, '1'}, {2, '2'}, {3, '3'}, {4, '4'}, {5, '5'}, {6, '6'}, {7, '7'}, {8, '8'}, {9, '9'}};
    const string_number::sym_map_type string_number::symbol_map_init =
        {{"point", '.'}, {"negative", '-'}, {"positive", '+'}};

    string_number operator+(string_number str_n1, string_number str_n2)
    {
        size_t len1 = str_n1.num.size(), len2 = str_n2.num.size();
        if (len1 > len2)
        {
            swap(str_n1, str_n2);
            swap(len1, len2);
        }
        bool carry = false;
        size_t i = len2 - 1;
        for (; i >= len2 - len1; i--)
        {
            str_n2.num.at(i) += str_n1.num.at(i - len2 + len1) - '0' + carry;
            carry = str_n2.num.at(i) - '0' > 9;
            str_n2.num.at(i) -= carry * 10;
            if (i == 0)
                break;
        }
        while (carry && !(len2 - len1 == 0))
        {
            str_n2.num.at(i)++;
            carry = str_n2.num.at(i) - '0' > 9;
            str_n2.num.at(i) -= carry * 10;
            if (i-- == 0)
                break;
        }
        if (carry)
            str_n2.num = '1' + str_n2.num;
        return str_n2;
    }

    ostream &operator<<(ostream &output, string_number str_n)
    {
        output << str_n.num;
        return output;
    }
    istream &operator>>(istream &input, string_number &str_n)
    {
        input >> str_n.num;
        return input;
    }

}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。