类的定义:

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. 关于MongoDB分布式高可用集群实现

    一.环境准备 1.本例使用3台Linux主机,IP地址如下: 点击(此处)折叠或打开 Server B Server C 2.根据需要,开启相应主机防火墙的相关端口.本次需要用到3台主机,所以开启这3 ...

  2. es6--之箭头函数

    「箭头函数」是 ECMAScript6 中非常重要的性特性.很多文章都在描述它的上下文透明性以及短语法.新特性必然会带来很多好处,但凡事都有两面性.本篇文章会通过情景引导,让你知晓哪些情景下应该绕过箭 ...

  3. Login登录页面的制作流程(摘要)

    *****我的QQ号:1539832180.欢迎一起讨论学习.*****   第一步:拿到设计图,先别急着切,先分析. 因为切图不只是切图,设计不只是设计.你得考虑四方面的因素: 1. 合理的切图,语 ...

  4. Webstrom卡顿问题解决

    1.设置node_modules 打开项目,新建node_modules空文件夹,然后右击选择Mark Directory as,选择Excluded. 2.设置ingore文件 files-> ...

  5. Apple Pay强势来袭,开发者应做的事情(转)

    "iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...

  6. Snmp的学习总结(二)

    一.SNMP简介 SNMP指的是简单网络管理协议.它属于TCP/IP五层协议中的应用层协议.它提供了一种简单和方便的模式来管理网络中的各个元素.这里的元素就是各个被管理的对象,可以是因特网中的某个硬件 ...

  7. 如何解决"The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path"

    今天我在eclipse上搭建新项目时,莫名其妙的出现这个错误,如下: The superclass "javax.servlet.http.HttpServlet" was not ...

  8. bzoj 1818 Cqoi2010 内部白点 扫描线

    [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1126  Solved: 530[Submit][Status][Disc ...

  9. Spring的声明式事务管理<tx:advice/> 有关的设置

    <tx:advice/> 有关的设置 这一节里将描述通过 <tx:advice/> 标签来指定不同的事务性设置.默认的 <tx:advice/> 设置如下: 事务传 ...

  10. Spring-IOC源码解读2.3-BeanDefinition的注册

    在DefaultListAbleBeanFactory中通过一个HashMap持有载入的BeanDefinition信息 ,这个HashMap的定义在DefaultListAbleBeanFactor ...