POJ 1503 大整数
之前做的大整数,都是一位一位操作。
优化方案:压缩方案。
模板: + - * 操作符重载
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std; struct bigint{ // only positive number;
static const int BASE=;
static const int WIDTH=;
vector<int> s;
//value
bigint(long long num=){ *this = num;}
bigint operator = (long long num){
s.clear();
do{
s.push_back(num%BASE);
num/=BASE;
}while(num>);
return *this;
}
bigint operator = (const string& str){
s.clear() ;
int x,len = (str.length()-)/WIDTH + ;
for(int i=;i<len;i++){
int end = str.length() - i*WIDTH;
int start = max(,end - WIDTH);
sscanf(str.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
}
return *this;
}
//input&output
friend ostream& operator << (ostream &out, const bigint& x){
out << x.s.back();
for(int i=x.s.size()-;i>=;i--){
char buf[];
sprintf(buf,"%08d",x.s[i]);
for(int j=;j<strlen(buf);j++) out << buf[j];
}
return out;
}
friend istream& operator >>(istream &in, bigint& x){
string s;
if(!(in>>s)) return in;
x=s;
return in;
}
//compare
bool operator < (const bigint& b) const {
if(s.size()!=b.s.size()) return s.size() < b.s.size();
for(int i=s.size()-;i>=;i++) if(s[i]!=b.s[i]) return s[i] < b.s[i];
return false;//equal
}
bool operator > (const bigint& b) const {return b < *this;}
bool operator <= (const bigint& b) const {return !(b < *this);}
bool operator >= (const bigint& b) const {return !(*this < b);}
bool operator != (const bigint& b) const {return b < *this || *this < b;}
bool operator == (const bigint& b) const {return !(b < *this) && !(*this < b);}
//calculate
bigint operator +(const bigint& b) const {
bigint c;
c.s.clear();
for(int i=,g=;;i++){
if(g== && i>=s.size() && i>=b.s.size()) break;
int x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x+=b.s[i];
c.s.push_back(x%BASE);
g = x/BASE;
}
return c;
}
bigint operator +=(const bigint& b){
*this = *this + b;
return *this;
}
bigint operator -(const bigint& b) const {
bigint c;
c.s.clear();
for(int i=,g=;;i++){
if(g== && i>=s.size() && i>=b.s.size()) break;
int x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x-=b.s[i];
x+=BASE;
c.s.push_back(x%BASE);
g = x/BASE - ;
}
return c;
}
bigint operator * (const bigint& b) const {
bigint c;
c.s.clear();
bigint g=;
for(int i=;;i++){
if(g.s.size()== && i>=s.size()+b.s.size()-) break;
bigint x;
x.s.clear() ;
for(int j=;j<g.s.size();j++) x.s.push_back(g.s[j]);
if(i<s.size()+b.s.size()-){
for(int j = max( , i-(int)s.size()+);j<=min(i,(int)b.s.size()-);j++){
bigint t = (long long)b.s[j]*s[i-j];
x += t;
}
}
c.s.push_back(x.s[]);
g.s.clear();
if(x.s.size()>) for(int j=;j<x.s.size();j++) g.s.push_back(x.s[j]);
}
return c;
}
}; int main()
{
//freopen("in.txt","r",stdin);
bigint a;
bigint b = ;
bigint sum = ; while(cin>>a) {
if(a==)
break;
sum +=a;
} cout<< sum <<endl; return ;
}
POJ 1503 大整数的更多相关文章
- POJ 1811 大整数素数判断 Miller_Rabin
#include <cstdio> #include <cstring> #include <cmath> #include <ctime> #incl ...
- POJ C++程序设计 编程题#1 大整数的加减乘除
编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- POJ 2506 Tiling(递推+大整数加法)
http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. #includ ...
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- 2981:大整数加法-poj
2981:大整数加法 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输 ...
- POJ 1503
http://poj.org/problem?id=1503 对于这个题我也是醉了,因为最开始是有学长和我们说过这个题目的,我以为我记得题目是什么意思,也就没看题目,结果按案例去理解题意,结果WA了一 ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
- AC日记——大整数的因子 openjudge 1.6 13
13:大整数的因子 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...
随机推荐
- OPENROWSET read excel
由于64位系统已经不支持 oledb 4.0访问 xls 1. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序 去http://download.microsoft. ...
- Java基础24-文档注释
格式: /** .......*/ /** 此类是对数组进行取最大值 @author 深海溺心 @version 1.0 */ public class Compare{ private Compar ...
- (转)Linux基础------Shell数值计算的几种方法
Linux基础------Shell数值计算的几种方法 原文:http://blog.csdn.net/fu_wayne/article/details/21620639 在Linux下总会遇到数值计 ...
- 编程中经常看到上下文context,这个上下文指得是什么?
举个栗子:小美气呼呼对我说:“你去死吧”,我当时哭了. 场景1:小美刚转学到我们学校,我暗恋了她很久,有一天鼓足勇气,向她表白,小美气呼呼对我说:“你去死吧”,我当时就哭了.场景2我跟小美从小青梅竹马 ...
- java中的各种修饰符作用范围
访问修饰符: private 缺省 protected public 作用范围: 访问修饰符\作用范围 所在类 同一包内其他类 其他包内子类 其他包内非子类 private 可以访问 不可以 不可以 ...
- emacs使用笔记
C-h t tutorial [移动基本操作]C-f C-b C-p C-n 前后上下 C-v C-a 行首 C-e行尾C-a 和 C-e 可以将光标移动到"一行"的头部和尾部.M ...
- bootstrap-table使用记录
效果如图所示: 1.框架用的flask 目录结构如下: 2.前端代码如下: table-test1.html <!DOCTYPE html> <html> <head&g ...
- frp使用总结
笔者所知并成功实现内网穿透的方法: 花生壳 (需要花8块钱,使用花生壳给的二级域名,这里不做介绍) ngrok (免费,但是每次重启服务二级域名会变,付费的$5每月不会变) frp(开源免费,需要有自 ...
- vs文件属性(生成操作)各选项功能
右击项目里的文件,选择属性(F4)会有[生成操作]的选项. 它提供了14项选择,如图: 在这说一下常用的选项: 1.编译 编译用于c#代码类的操作,编译之后输出在该程序集的bin目录下.换句话说,代码 ...
- Log4Net 之初体验
今天试了一下关于日志的一个插件——Log4Net 关于这个插件就不过多描述了,有很多人用,也挺好用比较方便,所以在此记录下使用过程. 一.建一个mvc 空网站 名字叫 Log4NetTest 二.下载 ...