博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数四则运算
阅读量:4217 次
发布时间:2019-05-26

本文共 2581 字,大约阅读时间需要 8 分钟。

注意:易错地方就是字符与数字的转换
例如:

  a += e +'0'; //在字符串中为字符2 在输出流中就是50(当做Int)
   if(e < 0){//此时char被转换为int类型
       printf("yes"); 
  }
一、大数加法
lensum需要大一位

string bigAdd(const string a,const string b)	{		int lena = a.size();		int lenb = b.size();		int lensum = lena > lenb ? lena+1 : lenb+1;		vector
res; res.resize(lensum); for(int i = 0,j = 0; i < lena && j < lenb; ++i,++j){ res[i] = a[lena-i-1]-'0' + b[lenb-i-1]-'0'; } if(lena > lenb){ for(int i = lenb; i < lena; ++i){ res[i] = a[lena-i-1]-'0'; } } else if(lenb > lena){ for(int i = lena; i < lenb; ++i){ res[i] = b[lenb-i-1]-'0'; } } for(int i = 0; i < lensum-1; ++i){ if(res[i] > 9){ int t = res[i]/10; res[i] = res[i]%10; res[i+1] += t; } } string r = ""; if(res[lensum-1]){//考虑最高位进位情况 r += res[lensum-1]+'0';//还原为字符类型加入到结果 } for(int i = lensum-2; i >= 0; --i){//这里是lensum-2 r += res[i]+'0';//都要转换为字符处理 } return r; }

二、大数减法:

string bigSub(const string a,const string b)	{		int lena = a.size();		int lenb = b.size();		int max_len = lena > lenb ? lena : lenb;		vector
res; res.resize(max_len); int flag = 1; if(lena < lenb || (lena == lenb && a < b)){ flag = 0; } if(flag) cout <<"a >= b"<
= b时候 for(int i = 0; i < lenb; ++i){ res[i] = a[lena-i-1]-b[lenb-i-1]; } for(int i = lenb; i < lena; ++i){ res[i] = a[lena-i-1]-'0'; } } else{ for(int i = 0; i < lena; ++i){ res[i] = b[lenb-i-1]-a[lena-i-1]; } for(int i = lena; i < lenb; ++i){ res[i] = b[lenb-i-1]-'0'; } } for(int i = 0; i < max_len; ++i){ if(res[i] < 0){ res[i] += 10; res[i+1] -= 1; } } string r = ""; if(!flag) r += "-"; int k; for(k = max_len-1; k >= 0; --k){ //过滤掉前缀 0 if(res[k] != 0) break; } if(k == -1){ return r += '0'; } for(; k >= 0; --k){ r += res[k]+'0'; } return r; }

三、大数乘法:

刚开始乘法也选择用vector<char>来存,后来发现数大的时候总是出现奇怪字符,突然想起可能是各段和超过了
char类型范围,所以后来用int类型的vector来存储结果
void bigMul(string a,string b)	{		int lena = a.size();		int lenb = b.size();		int max_len = lena+lenb+1;		vector
res; res.resize(max_len); reverse(a.begin(),a.end());//把a,b反转 reverse(b.begin(),b.end()); for(int i = 0; i < lena; ++i){ for(int j = 0; j < lenb; ++j){ res[i+j] += (a[i]-'0') * (b[j]-'0');//这里需要把字符 转换为 数字 } } for(int i = 0; i < max_len; ++i){//统一处理进位问题 if(res[i] > 9){ res[i+1] += res[i]/10; res[i] %= 10; } } int k; for(k = max_len-1; k >= 0; --k){//过滤多余的0 if(res[k] != 0) break; } if(k == -1){//防止结果为0 的情况呗过滤掉了 cout << 0; return ; } for(; k >= 0; --k){//结果输出 cout << res[k]; } return ; }

转载地址:http://ehimi.baihongyu.com/

你可能感兴趣的文章
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>
ccCArray.cpp 文件
查看>>
cocos2dx 屏幕大小
查看>>
libgdx: 2D Particle Editor工具使用
查看>>
eclipse 给jar库添加源码
查看>>
3.0正式版环境搭建(4)-- 运行(3)创建的工程
查看>>
C++ 枚举声明 enum 和 enum class
查看>>
Python optionParser模块的使用方法
查看>>
android 消灭星星出错
查看>>
PyCharm 教程(三)Hello world!
查看>>
PyCharm: 显示源码行号
查看>>
cocos2dx使用第三方字库.ttf,需要注意的事项
查看>>