博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#大数加减乘除#校赛D题solve
阅读量:4490 次
发布时间:2019-06-08

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

#include
#include
#include
#include
#include
#include
using namespace std;const static int M = 50;int numA[M];int numB[M];//使用string重置numAvoid resetNumA(string numAStr){ memset(numA,0,M*sizeof(int)); //将字符串的每一位都转换成数字传入数组 for (int i = 0; i < numAStr.length(); i++) { numA[i] = numAStr[numAStr.length()-i-1] - '0'; }}//使用string重置numBvoid resetNumB(string numBStr){ memset(numB,0,M*sizeof(int)); //将字符串的每一位都转换成数字传入数组 for (int i = 0; i < numBStr.length(); i++) { numB[i] = numBStr[numBStr.length()-i-1] - '0'; }}//将数组转换为字符串,用于输出string getNumString(int* num){ string numString; bool isBegin = false; for (int i = M-1; i >= 0 ; i--) { if(num[i] != 0) { isBegin = true; } if (isBegin) { numString += num[i] +'0'; } } return numString;}//判断两个数字哪个大int compare(string numAStr,string numBStr){ if (numAStr.length() > numBStr.length()) { return 1; } else if (numAStr.length() < numBStr.length()) { return -1; } else { for (int i = 0; i < numAStr.length(); i++) { if (numAStr[i]>numBStr[i]) { return 1; } if (numAStr[i]
9) { numA[i] -= 10; numA[i+1]++; } } return getNumString(numA);}//减法string ab(string numAStr, string numBStr){ bool isNegative = false; //如果numA比numB小 //则结果为负数 //调换位置进行计算 if (compare(numAStr,numBStr)==-1) { isNegative = true; string temp = numAStr; numAStr = numBStr; numBStr = temp; } else if (compare(numAStr,numBStr)==0) { return "0"; } resetNumA(numAStr); resetNumB(numBStr); for (int i = 0; i < M; i++) { //减数小于被减数就借位 if (numA[i]
nums; for (int i = 0; i < numBStr.length(); i++) { //初始化一个临时数据来保存被乘数与乘数的某一位相乘的结果 int temp[M]; memset(temp,0,M*sizeof(int)); for (int j = i; j < numAStr.length()+i; j++) { temp[j] += numA[j-i]*numB[i]%10; temp[j+1] = numA[j-i]*numB[i]/10; //如果大于9,那么就做进位处理 if (temp[j]>9) { temp[j]-=10; temp[j+1]++; } } nums.push_back(getNumString(temp)); } //每位相乘的结果再用加法加起来 string result = nums[0]; for (int i = 1; i < nums.size(); i++) { result = add(result,nums[i]); } return result;}//除,结果精确到个位string div(string numAStr, string numBStr){ resetNumA(numAStr); resetNumB(numBStr); string result; string left; if (compare(numAStr,numBStr)==-1) { return "0"; } //标记第一个不为0的位数的出现 bool flag = false; for (int i = 0; i < numAStr.length(); i++) { left +=numAStr[i]; //余数比除数大 if (compare(left,numBStr)==1) { flag = true; int cnt = 1; string temp = numBStr; while (true) { //每循环一次加上一个余数 temp = add(temp,numBStr); //余数仍然大于除数,继续累加 if (compare(left,temp)==1) { cnt++; } //余数小于除数 //可以计算结果 else if (compare(left,temp)==-1) { result += cnt + '0'; left = ab(left, ab(temp,numBStr)); break; } //此时余数刚好是除数的倍数 else if (compare(left,temp) == 0) { cnt ++; result += cnt + '0'; left = ""; break; } } } //刚好除尽 else if(compare(left,numBStr)==0) { flag = true; result +="1"; left = ""; } //余数比除数小,跳到下一位 else if(flag&&compare(left,numBStr)==-1) { result +="0"; left=""; } } return result;}int getMod(string s){ int len=s.length(); int ans=0; for(int i=0;i
>str; string s1="1",s2="2"; string str2=div(str,s2); string ans=mul(str2,ab(str2,s1)); if(getMod(str)==1) ans=add(ans,ab(div(add(str,s1),s2),s1)); cout<
<

转载于:https://www.cnblogs.com/atmacmer/p/5441308.html

你可能感兴趣的文章
iOS 线程安全
查看>>
mysql 分组之后统计记录条数
查看>>
New STL Algorithms That Will Make A More Productive Developer
查看>>
js 对象 浅拷贝 和 深拷贝
查看>>
初识 python
查看>>
PCL Examples
查看>>
spring boot
查看>>
浏览器URL传参最大长度问题
查看>>
学习进度条
查看>>
Linux crontab 定时任务详解
查看>>
string成员函数
查看>>
onSaveInstanceState()方法问题
查看>>
[转]CocoaChina上一位工程师整理的开发经验(非常nice)
查看>>
大数据时代侦查机制有哪些改变
查看>>
雷林鹏分享:jQuery EasyUI 菜单与按钮 - 创建链接按钮
查看>>
Apache Traffic Server服务搭建
查看>>
poj1990两个树状数组
查看>>
学习python-day1
查看>>
Zend_Db_Table->insert ()和zend_db_adapter::insert方法返回值不同
查看>>
递归问题
查看>>