POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法
这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于错误的判断还不够严厉. 对边界情况的讨论其实应该是思维严密的表现,当然这并不能表明我写的一点错误都没有,只是多多分析一下还是很有好处的。
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#define MAXSIZE 7
using namespace std;
string result;
string tmp;
string base;//基数; //从此可以看到c比c++的优越之处;
string mul(string multiplied,string multiplier)
{
tmp = string(150,'0');
int carrier=0;//进位;
int answer=0;//得数;
int j = 0;int i = 0;
for (i = 0; i < multiplied.length(); i++)
{
carrier = 0;
for (j = 0; j < multiplier.length(); j++)
{
answer = ((multiplier.at(j)-'0')*(multiplied.at(i)-'0') + (tmp.at(i+j)-'0') + carrier )%10;
carrier = ((multiplier.at(j)-'0')*(multiplied.at(i)-'0') + (tmp.at(i+j)-'0') + carrier )/10;
tmp[i+j] = answer + '0';
}
if (carrier)
{
tmp[i+j] = carrier + '0';
}
}
//tmp[i+j]='/0';//不知道这个是否有必要;
tmp = tmp.substr(0,i+j);
return tmp;
}
string expo(string multier,int time)
{
if (time==1)//如果要乘一次,直接返回;
{
return multier;
}
result = expo(multier,time-1);
/*下面计算multier与result的乘积 */
return mul(result,multier); } int main()
{ #ifndef ONLINE_JUDGE
freopen("D://code//acm//txt//11.txt","r",stdin);//如果不是在OJ上运行那么就从本地的这个文件中读取信息;
#endif
int time;//次数; while(cin>>base>>time)
{
/*下面的代码可以用来处理无效0*/
int start = 0;
int end = base.length()-1;
int pos = base.find('.');
while( start <= base.length()-1 && base.at(start)=='0' )
{
start++;
}
if (pos!=-1)//如果存在小数点;
{
while (end>=0 && base.at(end)=='0')
{
end--;
}
} //执行之后start指向第一个不为0的位,end指向小数部分最后一个不为0的整数,如果没有小数则指向个位部分;
/*下面取出有效部分*/
base = base.substr(start,end-start+1);
/*下面记下小数点位置并除去小数点*/
pos = base.find('.');
/*下面计算结果中小数部分的长度,那么它也可以作为结果倒置的时候的下标*/
if(pos!=-1){
int len = base.length();
base.erase(pos,1);
pos = time * (len-pos-1);
}
/*下面可以将这个字符串倒置*/
/*cout<<base<<" ";*/
reverse(base.begin(),base.end());
/*cout<<base<<endl;*/ /*下面开始根据time次数进行大整数乘法*/
end = 0;
result = expo(base,time);
if(pos!=-1){
result.insert(pos,1,'.'); while (result.at(end) == '0')
{
end++;
}
//判断剩下的最后一位是不是小数点;
if ( result.at(end) == '.')
{
end++; }
}
//下面删去前面多余的0;
start = result.length()-1;
while (start >=0 && result.at(start) == '0')
{
start--;
}
if(start<end)//表示结果是0;
{
result = "0";
}else{
result = result.substr(end,start-end+1);
reverse(result.begin(),result.end());
}
////判断剩下的整数是不是0;
//end = result.length()-1;
//while (end >=0 && result.at(end) == '0')
//{
// end--;
//}
//if (end == -1)
//{
// result = "0";
//}
cout<<result<<endl;
} return 0;
}
写这个代码我所得到的 :
一、c与c++ java 各有各的优势 不能互相替代(永远不可能,所以不要妄想只学一门语言)
1.c语言从来不要你急什么东西,库函数也不多,没什么记忆的压力,当你用c语言写东西的时候,你会感觉到好像是你自己在说话,好像这语言你你发明的似得,也许这就是孔子说的七十而从心所欲不逾矩(装逼开始,我第一次感受到编程就像自己在跟电脑说话是在高中一年级的VB课上,不过只学过一学期,但是那是我编程的启蒙,那时候我总是在班上第一个编出程序,但这并不是最变态的,最变态的是,在此之前我从来没见过键盘,电脑倒是远远的见过,装逼时间到)。这种感觉我从没有在c++上获得过,因为我用c++写的代码很多第一遍都会有错误。
2.c++标准函数太多了学的时间长 而且还有重载所以一个函数不容易记住,并且记住了参数顺序也记不住,所以大概c++语法是用来查的吧。
3.c++标准函数多的好处是 你写代码效率会比较高,比如reverse函数,不用实现一些东西,另外一些函数虽然在c中有替代品但是实现的并不好,比如find函数在c中是strchr函数但是返回的是个指针,指针就各种不爽了。但是不好的东西就是c++不精确,比如这里记录中间过程结果的是string类型,但是string对象是不允许对内容进行修改的,你进行的操作大概是新建了另一个对象效率自然不行,虽然c++兼容c语法,但说到底还是c。
4.当然c++写项目还是没有java爽。
二、有用的c++函数总结
三、对以后写代码有用的模版
string mul(string multiplied,string multiplier)
{
tmp = string(150,'0');
int carrier=0;//进位;
int answer=0;//得数;
int j = 0;int i = 0;
for (i = 0; i < multiplied.length(); i++)
{
carrier = 0;
for (j = 0; j < multiplier.length(); j++)
{
answer = ((multiplier.at(j)-'0')*(multiplied.at(i)-'0') + (tmp.at(i+j)-'0') + carrier )%10;
carrier = ((multiplier.at(j)-'0')*(multiplied.at(i)-'0') + (tmp.at(i+j)-'0') + carrier )/10;
tmp[i+j] = answer + '0';
}
if (carrier)
{
tmp[i+j] = carrier + '0';
}
}
//tmp[i+j]='/0';//不知道这个是否有必要;
tmp = tmp.substr(0,i+j);
return tmp;
}
作用:这个可以用来进行大整数乘法;
四、一些已经掌握的良好习惯
#ifndef ONLINE_JUDGE
freopen("D://code//acm//txt//11.txt","r",stdin);//如果不是在OJ上运行那么就从本地的这个文件中读取信息;
#endif
3、等等
五、本题所体现的边界条件或者需要注意的讨论点
POJ 1001 解题报告 高精度大整数乘法模版的更多相关文章
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- OpenJudge 2980 大整数乘法
链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...
- 大整数乘法python3实现
因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- [大整数乘法] java代码实现
上一篇写的“[大整数乘法]分治算法的时间复杂度研究”,这一篇是基于上一篇思想的代码实现,以下是该文章的连接: http://www.cnblogs.com/McQueen1987/p/3348426. ...
- 大整数乘法(Comba 乘法 (Comba Multiplication)原理)
Comba 乘法以(在密码学方面)不太出名的 Paul G. Comba 得名.上面的笔算乘法,虽然比较简单, 但是有个很大的问题:在 O(n^2) 的复杂度上进行计算和向上传递进位,看看前面的那个竖 ...
- JS实现大整数乘法(性能优化、正负整数)
本方法的思路为: 一:检查了输入的合法性(非空,无非法字符) 二:检查输入是否可以进行简单计算(一个数为 0,1,+1,-1) 三:去掉输入最前面可能有的正负符号,并判断输出的正负 四:将输入的值分成 ...
- 算法笔记_034:大整数乘法(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import ...
- poj分类解题报告索引
图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...
随机推荐
- 安卓AlertDialog的使用
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setMessage("数 ...
- SimpleAliasRegistry implements AliasRegistry
Spring - 4.2.3 // name,alias存储容器 ConcurrentHashMap <alias,name>private final Map<String, St ...
- mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法
版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...
- uva 784 Maze Exploration 染色 搜索水题 DFS
染色问题,其实就是看看图上某一点能扩散多少. 用DFS解决,因为BFS不是很熟 =-=...以后要多练. 提交后32ms,优化了一下,在递归前进行判定,优化到22ms,不是优化的很好... 代码: # ...
- 24小时学通Linux内核之内存管理方式
昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...
- Linux 命令 - lsof: 列出打开的文件
lsof 是一个列出当前系统打开文件的工具. 命令格式 lsof [ -?abChlnNOPRstUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ + ...
- redis学习-day1
1.nosql数据库的一种. 2.Redis 是一种开源的,先进的key-value存储.它通常被称为数据结构服务器.因为键可以包含字符串.哈希.链表.集合和有序集合. 特点: 3.为了保证效率,数据 ...
- SQL 行转列
---1.最简单的行转列/* 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94 想变成(得到如下结 ...
- ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法
ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法 转载:http://blog.csdn.net/yao_qinwei/article/details/8761777 在插入模式下,按删 ...
- ASP.NET MVC 路由进阶(之一)
1. MVC框架下的WebForm页面. 我们在MVC项目下新建一个WebForm页面. 然后右键浏览,打开页面,如下图: 发现页面能够正常访问.ok,我们尝试改一下Global.asax.cs中的 ...