使用string实现一个用于储存那些太大而无法使用 long long 的数
类的定义:
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 的数的更多相关文章
- Mac OS 系统占用储存空间太大怎么办?
存储空间 121 GB,系统就占用 106G,然后就是不断的弹窗提醒你! 解决方法: 终端先执行一下 du -sh * 查看具体是哪里使用了存储空间,一般都是 library 占用比较多的空间, 把可 ...
- Numeral.js 是一个用于格式化和数字四则运算的js 库
1.Numeral.js 是一个用于格式化和数字四则运算的js 库. 2.支持多种语言,包含中文在内的17种语言. 在浏览器中引用js文件: <script src="numeral. ...
- 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块
简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...
- 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)
一步步做程序优化[1]讲一个用于OpenACC优化的程序 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta* ...
- Dictionary<string, string>是一个泛型使用说明
Dictionary<string, string>是一个泛型使用说明 Posted on 2010-08-05 15:03 moss_tan_jun 阅读(2273) 评论(0) 编辑 ...
- ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”
ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...
- Huxley 是一个用于Web应用 UI 测试的工具
Huxley 是一个用于Web应用 UI 测试的工具,由 Pete Hunt 和 Maykel Loomans 用 Python 开发. UI 测试比较令人头疼. UI测试不好写,而且很容易失效: ...
- Druid:一个用于大数据实时处理的开源分布式系统
Druid是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid仍 ...
- 17.1.1.3 Creating a User for Replication 创建一个用于用于复制:
17.1.1.3 Creating a User for Replication 创建一个用于用于复制: 每个slave 连接到master 使用一个MySQL 用户名和密码, 因此必须有一个用户账户 ...
随机推荐
- 03004_Web开发
1.Web开发中常见的概念 (1)B/S系统和C/S系统 ①Brower/Server:浏览器 服务器 系统------网站: ②Client/Server:客户端 服务器 系统------QQ.大型 ...
- 解决手机助手与 android sdk 的adb 冲突问题
现象:手机助手与 sdk 内的 adb冲突,用助手与真机连接后,sdk adb 就被干掉了 突发奇想: 突然有一天想到用助手的adb来覆盖sdk内的adb,果然奏效.现在eclipse.助手.cmd窗 ...
- 九度oj 题目1104:整除问题
题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2<=n<=1000),a(2<=a<=1000) 输出: 一个整数. ...
- 原生 ajax get请求数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法
这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...
- VS2015 “GENERATERESOURCE”任务意外失败 解决方法
昨天把项目解决方案Copy到另外的机器上执行,遭遇了一场"任务意外失败",网上搜索一下,顺利解决了,在此记录一下. Visual Studio.net 工程更换机器编译时遇到”Ge ...
- idea修改变量及其引用
idea 修改某一变量及其引用 选中变量 shift+f6(shift+fn+f6), ctrl+R的当前页面全局替换, ctrl+shift+R 项目中的全局替换
- 洛谷——P2819 图的m着色问题
P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的 ...
- http状态码的分类
状态码分类 转自http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html HTTP状态码被分为五大类, 目前我们使用的HTTP协议 ...
- rsync故障排查整理
1.客户端的错误现象:No route to host rsync服务端开启了iptables防火墙 rsync -avz /etc/hosts rsync_backup@172.16.1.41::b ...