博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】大数乘法
阅读量:4322 次
发布时间:2019-06-06

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

POJ:1001

===============我是分割线=================

 

1 /*  2 *Copyright: CheerM  3 *Author: CheerM  4 *Date: 2016-11-14  5 *Description: 实现 底数B为6位宽浮点数 指数E为(0,25】的数,求值  6 */  7   8 #include 
9 #include
10 #include
11 #include
12 13 using namespace std; 14 15 const int max_ = 10000;//保留四位数 16 17 /* 18 *Function: multiply 19 *Description: 被乘数任意长vector
& multiplicand, 乘数为定长,不超过6位的int multiplier,相乘的值保存在vector
& multiplicand中 20 *parameter: vector
& multiplicand 表示任意长的被乘数 21 * int multiplier 表示定长不超过6位数的乘数 22 *Return: void 23 */ 24 void multiply(vector
& multiplicand, int multiplier) { 25 int carry = 0; 26 for (int i = 0; i < multiplicand.size(); i++) { 27 int t1 = multiplicand[i] * multiplier + carry; 28 multiplicand[i] = t1 % max_; 29 carry = t1 / max_; 30 } 31 if (carry != 0) { 32 while (carry) { 33 multiplicand.push_back(carry % max_); 34 carry /= max_; 35 } 36 } 37 } 38 39 int main() { 40 string base;//底数 41 int exponentiation, point, mark;//指数,小数点后有效位数,‘.’标识符 42 while (cin >> base >> exponentiation) { 43 point = mark = 0; 44 45 //记录小数点后数字位数,忽略最右的连续0 46 for (int i = base.size() - 1; i >= 0; i--) { 47 if (base[i] == '0' && point == 0) 48 continue; 49 else if (base[i] == '.') { 50 mark = 1; 51 break; 52 } 53 else 54 point++; 55 } 56 if (!mark)point = 0; 57 58 //把底数base从字符串转化为整型,e.g. 12.345 -> int:12345 point=3, 1.0100 -> int:101 point=2 59 int tempBase = 0, tmp = point;//tempBase是底数的int形式 60 mark = 0; 61 for (int i = 0; i < base.size() && tmp >= 0; i++) { 62 if (base[i] >= '0' && base[i] <= '9') { 63 tempBase = tempBase * 10 + base[i] - '0'; 64 } 65 else if (base[i] == '.') { 66 mark = 1; 67 } 68 69 if (mark == 1) { 70 tmp--; 71 } 72 } 73 74 //初始化被乘数为1,循环相乘 75 vector
result;//vector来存储超长int型整数,因为乘数有可能是6位数,而int最大值可以10位,所以result的每一个单位用来存储4位结果,从低到高 76 result.push_back(1); 77 point *= exponentiation; 78 while (exponentiation--) { 79 multiply(result, tempBase); 80 } 81 82 //把vector转为string 83 string ss; 84 for (int i = 0; i < result.size(); i++) { 85 int tt = result[i]; 86 for (int j = 0; j < 4; j++) { 87 ss.push_back(tt % 10 + '0'); 88 tt /= 10; 89 if (ss.size() == point) ss.push_back('.'); 90 if (i == result.size() - 1 && tt == 0) break; 91 } 92 } 93 while (ss.size() < point) { //补0 94 ss.push_back('0'); 95 if (ss.size() == point) ss.push_back('.'); 96 } 97 98 //输出 99 for (int i = ss.size() - 1; i >= 0; i--)100 cout << ss[i];101 cout << endl;102 }103 104 system("pause");105 return 0;106 }
View Code

 

转载于:https://www.cnblogs.com/cheermyang/p/6064024.html

你可能感兴趣的文章
MSP430单片机存储器结构总结
查看>>
文本框过滤特殊符号
查看>>
教育行业安全无线网络解决方案
查看>>
7个杀手级的开源监测工具
查看>>
软件架构学习小结
查看>>
C语言实现UrlEncode编码/UrlDecode解码
查看>>
返回用户提交的图像工具类
查看>>
树链剖分 BZOJ3589 动态树
查看>>
挑战程序设计竞赛 P131 区间DP
查看>>
【例9.9】最长公共子序列
查看>>
NSFileManager打印目录下的文件的函数
查看>>
Selenium自动化-调用Mysql数据库
查看>>
项目一
查看>>
[转载]AAF灵便应用框架简介系列(6):休息一下,泛谈面向对象 Why OO+多层结构?...
查看>>
android EditView ime
查看>>
javascript 学习随笔7
查看>>
<P>标签小细节
查看>>
Linux 命令 - netstat
查看>>
mac 关闭&&显示隐藏文件命令
查看>>
JavaScript 循环绑定之变量污染
查看>>