类的定义:

class stringInt {
public:
stringInt();
stringInt(string num);
stringInt(int num);
stringInt operator+(stringInt & num);
stringInt operator-(stringInt & num); // ... 还可以乘除之类的操作 private:
string str;
};

所用的函数:

// 将string和int相互转换
string num2string(int num);
int string2num(string str);
int compareTwoNum(string firstStr, string secondStr); // 比较两个用string表示的数的大小
int twoCharAdd(char ch1, char ch2, bool moreOne); // 对两个用char表示的数的加操作
int twoCharSub(char ch1, char ch2, bool &lessOne); // 对两个用char表示的数的减操作
void transpose(string &str); // 将一个string转置

在对加、减操作的实现中,主要依赖stringAdd()、stringSubtract()函数,用于对两个用string表示的数做加减

具体实现:

string stringAdd(string firstStr, string secondStr)
{
string outStr;
int firstStrLen, secondStrLen, sum;
firstStrLen = firstStr.length();
secondStrLen = secondStr.length();
bool moreOne = false;
string temp = ""; //cout << firstStr << endl;
//cout << secondStr << endl;
//cout << firstStrLen << " " << secondStrLen << endl; //cout << "Init outStr: " << outStr << endl; if (firstStrLen >= secondStrLen) {
//int cnt = firstStrLen; for (int i = firstStrLen - ; i >= ; i--) { //cout << "i = " << i << endl; if (secondStrLen > ) {
sum = twoCharAdd(firstStr[i], secondStr[secondStrLen - ], moreOne); cout << "sum = " << sum << endl; if (sum >= ) {
moreOne = true;
outStr.append(num2string(sum - ));
// string 没有在字符串头部增加一个字符的函数,虽然实现这个函数并不复杂,但此处如果使用头部
// 增加一个元素的函数,则在每一个循环都需要使用,与使用append() 再 将结果字符串反转相比,需要
// 的代价相差太大,所以此处选用后一种方法
}
else {
moreOne = false;
outStr.append(num2string(sum));
} secondStrLen--; //cout << "secondStrLen = " << secondStrLen << " " << outStr << endl; continue;
} if (moreOne) {
sum = twoCharAdd(firstStr[i], '', moreOne); //cout << "No continue sum = " << sum << endl; if (sum >= ) {
moreOne = true;
outStr.append(num2string(sum - ));
}
else {
moreOne = false;
outStr.append(num2string(sum));
}
}
else {
if (i != ) { // 当 i = 0 时,&firstStr[0] 表示整个 firstStr 字符串
outStr.append(&firstStr[i]);
}
else {
temp[] = firstStr[i];
outStr.append(temp);
} }
}
//cout << "End for outStr = " << endl;
}
else {
int cnt = secondStrLen;
for (int i = cnt - ; i >= ; i--) {
if (firstStrLen > ) {
sum = twoCharAdd(firstStr[firstStrLen - ], secondStr[i], moreOne); if (sum >= ) {
moreOne = true;
outStr.append(num2string(sum - ));
}
else {
moreOne = false;
outStr.append(num2string(sum));
} firstStrLen--;
continue;
} if (moreOne) {
sum = twoCharAdd('', secondStr[i], moreOne); if (sum >= ) {
moreOne = true;
outStr.append(num2string(sum - ));
}
else {
moreOne = false;
outStr.append(num2string(sum));
}
}
else {
if (i != ) {
outStr.append(&secondStr[i]);
}
else {
temp[] = secondStr[i];
outStr.append(temp);
}
}
}
} transpose(outStr); return outStr;
} string stringSubtract(string firstStr, string secondStr) // 第一个是减数,第二个是被减数
{
int firstStrLen, secondStrLen;
string outStr;
firstStrLen = firstStr.length();
secondStrLen = secondStr.length(); //cout << "初始outStr:" << outStr << endl; //cout << "两字符串长度为:" << firstStrLen << " " << secondStrLen << endl;
//cout << "两字符串为:" << firstStr << " " << secondStr << endl; char ch = '';
string minus = "-";
bool lessOne = false; //cout << "compareTN: " << compareTwoNum(firstStr, secondStr) << endl; if (compareTwoNum(firstStr, secondStr) == ) {
for (int i = firstStrLen - ; i >= ; i--) {
if (secondStrLen > ) {
int sub = twoCharSub(firstStr[i], secondStr[secondStrLen -], lessOne); cout << "sub = " << sub << endl;
cout << "n2s_sub = " << num2string(sub) << endl; outStr.append(num2string(sub));
secondStrLen--; //cout << outStr << endl; continue;
} int sub = twoCharSub(firstStr[i], '', lessOne);
outStr.append(num2string(sub)); //cout << outStr << endl;
} //cout << outStr << endl;
}
else if (compareTwoNum(firstStr, secondStr) == -) {
for (int i = secondStrLen - ; i >= ; i--) {
if (firstStrLen > ) {
int sub = twoCharSub(secondStr[i], firstStr[firstStrLen - ], lessOne);
outStr.append(num2string(sub));
firstStrLen--;
continue;
} int sub = twoCharSub(secondStr[i], '', lessOne);
outStr.append(num2string(sub));
} //cout << "加负号前 outStr = " << outStr << endl; outStr.append(minus);
}
else {
outStr.append(&ch);
} //cout << "加负号后,转置前 outStr = " << outStr << endl; transpose(outStr); return outStr;
} string stringMultiply(string firstStr, string secondStr)
{
return string();
}

将string和int相互转换

string num2string(int num)
{
//cout << "num = " << num << endl; stringstream ss;
ss << num; string str = ss.str(); //cout << str << endl; return str;
} int string2num(string str)
{
stringstream ss;
ss << str;
int num;
ss >> num; return num;
}

其他的辅助函数的实现

int twoCharAdd(char ch1, char ch2, bool moreOne)
{
int sum, num1, num2;
num1 = string2num(&ch1);
num2 = string2num(&ch2); if (moreOne) {
sum = num1 + num2 + ;
}
else {
sum = num1 + num2;
} return sum;
} void transpose(string &str)
{
int len = str.length(); for (int i = ; i < len / ; i++) {
char tempChar = str[i];
str[i] = str[len - - i];
str[len - - i] = tempChar;
} return;
} int compareTwoNum(string firstStr, string secondStr)
{
int firstStrLen, secondStrLen;
firstStrLen = firstStr.length();
secondStrLen = secondStr.length(); if (firstStrLen > secondStrLen) {
return ;
}
else if (firstStrLen < secondStrLen) {
return -;
}
else {
for (int i = ; i < firstStrLen; i++) {
if (string2num(&firstStr[i]) > string2num(&secondStr[i])) {
return ;
}
else if (string2num(&firstStr[i]) < string2num(&secondStr[i])){
return -;
}
else {
continue;
}
}
} return ;
} int twoCharSub(char ch1, char ch2, bool &lessOne)
{
//cout << ch1 << " " << ch2 << " " << lessOne << endl; int num1, num2; if (lessOne) {
num1 = string2num(&ch1) - ;
}
else {
num1 = string2num(&ch1);
} num2 = string2num(&ch2); if (num1 >= num2) {
lessOne = false;
return num1 - num2;
}
else {
lessOne = true;
return + num1 - num2;
}
}

收获:

更加熟悉string等...

使用string实现一个用于储存那些太大而无法使用 long long 的数的更多相关文章

  1. Mac OS 系统占用储存空间太大怎么办?

    存储空间 121 GB,系统就占用 106G,然后就是不断的弹窗提醒你! 解决方法: 终端先执行一下 du -sh * 查看具体是哪里使用了存储空间,一般都是 library 占用比较多的空间, 把可 ...

  2. Numeral.js 是一个用于格式化和数字四则运算的js 库

    1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...

  3. 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块

    简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...

  4. 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)

    一步步做程序优化[1]讲一个用于OpenACC优化的程序 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta* ...

  5. Dictionary<string, string>是一个泛型使用说明

    Dictionary<string, string>是一个泛型使用说明 Posted on 2010-08-05 15:03 moss_tan_jun 阅读(2273) 评论(0) 编辑  ...

  6. ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”

    ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...

  7. Huxley 是一个用于Web应用 UI 测试的工具

    Huxley 是一个用于Web应用 UI 测试的工具,由  Pete Hunt 和 Maykel Loomans 用 Python 开发. UI 测试比较令人头疼. UI测试不好写,而且很容易失效: ...

  8. Druid:一个用于大数据实时处理的开源分布式系统

    Druid是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid仍 ...

  9. 17.1.1.3 Creating a User for Replication 创建一个用于用于复制:

    17.1.1.3 Creating a User for Replication 创建一个用于用于复制: 每个slave 连接到master 使用一个MySQL 用户名和密码, 因此必须有一个用户账户 ...

随机推荐

  1. 解决手机助手与 android sdk 的adb 冲突问题

    现象:手机助手与 sdk 内的 adb冲突,用助手与真机连接后,sdk adb 就被干掉了 突发奇想: 突然有一天想到用助手的adb来覆盖sdk内的adb,果然奏效.现在eclipse.助手.cmd窗 ...

  2. 【LeetCode】Reorder Log Files(重新排列日志文件)

    这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...

  3. NYOJ 311 完全背包

    完全背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是 ...

  4. 九度oj 题目1140:八皇后

    题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的 ...

  5. RHEL7网卡命名规则

    systemd 和 udev 引入了一种新的网络设备命名方式:一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING).根据固件.拓扑.位置信息来设置固定名字,带来的好处是 ...

  6. Git 撤消操作

    修改最后一次提交 有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了.想要撤消刚才的提交操作,可以使用 --amend 选项重新提交: $ git commit --amend 此命令将 ...

  7. P3146 [USACO16OPEN]248 (区间DP)

    题目描述  给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-40),问最大能合出多少.注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3. 这道题的思路: 状态: ...

  8. msp430项目编程55

    msp430综合项目---扩展项目五55 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  9. array的用法(关于动态选择值)

  10. 异常来自 HRESULT:0x800A01A8

    Windows 10 Enterprise Microsoft Office 2013 – Excel Oracle BI Publisher Desktop 11.1.1.7 异常来自 HRESUL ...