大整数四则运算------(c++ 实现 乘法没有用傅里叶变换)
/* 优点:
1 支持负整数的运算
2 良好的输出形式 没有前导零
3 支持cin直接输入 支持cout直接输出
4 支持整数的直接赋值 big_int x=100;
缺点:
1 封装不好 基本都是友元函数操作
2 速度慢 乘法没有使用FFT 除法采用二分法
使用STL string储存数据也造成速度不是很快
3 待解决的问题 不能直接输出 cout<<a-b
*/ #include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
void change (string &s) {
string tmp="";
int i;
for (i=;i<s.size();i++)
if (s[i]!='')
break;
if (i==s.size()) s="";
else {
for (;i<s.size();i++)
tmp+=s[i];
s=tmp;
}
}
class big_int
{
private :
bool flag;
string s;
public :
big_int (){ flag=; s=""; }
big_int (int x);
bool operator ==(const big_int& x) {
string tmp=x.s;
change (s);
change (tmp);
if (x.s==""&&s=="") return true;
return x.flag==flag&&s==tmp;
}
friend big_int operator+(const big_int& a, const big_int& b );
friend big_int operator-(const big_int& a, const big_int& b );
friend big_int operator*(const big_int& a, const big_int& b);
friend big_int operator/(const big_int& a, const big_int& b);
friend big_int operator%(const big_int& a, const big_int& b);
friend ostream& operator<<(ostream& out,big_int& x) {
if (!x.flag&&x.s!="") cout<<"-";
change (x.s);
cout<<x.s;
return out;
}
friend istream& operator>>(istream& in,big_int& x) {
string tmp;
cin>>tmp;
if (tmp[]=='-') {
x.flag=;
x.s=tmp.substr(,tmp.size()-);
}
else {
x.flag=;
x.s=tmp;
}
return in;
}
};
big_int:: big_int (int x) {
if (x<) flag=;
else flag=;
x=abs(x); s=""; string tmp="";
if (x==) s+=tmp;
while (x!=) {
tmp[]=''+x%;
s+=tmp;
x/=;
}
reverse(s.begin(),s.end());
}
string add(string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
int len =max (s1.size(),s2.size());
int k=; int t1,t2;
string ans=""; string tmp="";
for (int i=;i<len;i++) {
t1=t2=;
if (i<s1.size()) t1=s1[i]-'';
if (i<s2.size()) t2=s2[i]-'';
int t=t1+t2+k;
tmp[]=''+t%; k=t/;
ans+=tmp;
}
if (k!=) {
tmp[]=''+k;
ans+=tmp;
}
reverse(ans.begin(),ans.end());
return ans;
}
string sub (string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
int len =s1.size();
int t1,t2;
string ans=""; string tmp="";
for (int i=;i<len;i++) {
t1=s1[i]-''; t2=;
if (i<s2.size()) t2=s2[i]-'';
if (t1<t2) {
for (int j=i+;j<len;j++)
if (s1[j]-''==) s1[j]='';
else {
s1[j]--;
break;
}
t1+=;
}
tmp[]=t1-t2+'';
ans+=tmp;
}
reverse(ans.begin(),ans.end());
change(ans);
return ans;
}
bool m_cmp (string s1, string s2) {
change (s1);
change (s2);
if (s1.size()==s2.size()) {
for (int i=;i<s1.size();i++)
if (s1[i]!=s2[i])
return s1[i]>s2[i];
}
return s1.size()>s2.size();
}
string s_mul (string s,int x,int k) {
string ans=""; string tmp="";
for (int i=;i<=k;i++) ans+=tmp;
k=;
for (int i=;i<s.size();i++) {
int t=s[i]-'';
int p=t*x+k;
tmp[]=''+p%; ans+=tmp;
k=p/;
}
if (k) {
tmp[]=''+k;
ans+=tmp;
}
reverse(ans.begin(),ans.end());
change(ans);
return ans;
}
string mul (string s1,string s2) {
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
string ans="";
for (int i=;i<s2.size();i++) {
int x=s2[i]-'';
string tmp=s_mul (s1,x,i);
ans=add(ans,tmp);
//cout<<ans<<endl;
}
return ans;
}
big_int operator+(const big_int& a, const big_int& b ) {
big_int c;
int t=a.flag^b.flag;
if (t==) {
c.s=add (a.s,b.s);
c.flag=a.flag;
}
else {
if (m_cmp(a.s,b.s)) {
c.flag=a.flag;
c.s=sub (a.s,b.s);
}
else {
c.flag=b.flag;
c.s=sub (b.s,a.s);
}
}
return c;
}
big_int operator-(const big_int& a, const big_int& b ) {
big_int c=b;
c.flag=!b.flag;
return a+c;
}
big_int operator*(const big_int& a, const big_int& b) {
big_int c;
int t=a.flag^b.flag;
if (t) c.flag=;
if (m_cmp(a.s,b.s)) c.s=mul (a.s,b.s);
else c.s=mul (b.s,a.s);
return c;
}
big_int operator/(const big_int& a, const big_int& b) {
if (b.s=="") {
cout<<"error"<<endl;
exit(-);
}
big_int c;
big_int _a=a, _b=b;
_a.flag=_b.flag=;
if (m_cmp(_b.s,_a.s)) return c; stack <big_int> q;
big_int k=;
while () {
big_int x=k*_b; q.push(k);
if (m_cmp(x.s,_a.s))
break;
k=k*;
}
big_int tmp=_a;
while (tmp.s!=""&&!q.empty()) {
k=q.top(); q.pop();
big_int x=k*_b;
if ( !m_cmp(x.s,tmp.s)) {
tmp=tmp-x;
c=c+k;
}
}
if (a.flag^b.flag) c.flag=;
return c;
}
big_int operator%(const big_int& a, const big_int& b) {
big_int c=a/b;
c=c*b;
c=a-c;
return c;
}
int main ()
{
big_int a,b;
big_int c=-;
cout<<c<<endl;
while (cin>>a>>b) {
c=a+;
cout<<c<<" ";
c=a-b;
cout<<c<<" ";
c=a*b;
cout<<c<<" ";
c=a/b;
cout<<c<<" ";
c=a%b;
cout<<c<<endl;
}
return ;
}
大整数四则运算------(c++ 实现 乘法没有用傅里叶变换)的更多相关文章
- 大整数四则运算(vector与数组两种版本实现)
每逢大整数四则运算,都会怯懦,虽是算法竞赛必会的东西,也零散的学过,简单的总结过,但不成体系的东西心里一直没底. 所以今天消耗了大量的卡路里,啃了几套模板之后终于总结成了一套自己的模板 再也不用担心大 ...
- 大整数算法[09] Comba乘法(原理)
★ 引子 原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...
- Code Kata:大整数四则运算—乘法 javascript实现
上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...
- 大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- [转]大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现
大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...
- Code Kata:大整数四则运算—除法 javascript实现
除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...
- 大整数算法[10] Comba乘法(实现)
★ 引子 上一篇文章讲了 Comba 乘法的原理,这次来讲讲如何实现.为了方便移植和充分发挥不同平台下的性能,暂时用了三种不同的实现方式: 1.单双精度变量都有的情况. 2.只有单精度变量的情况. 3 ...
- C语言课程设计大整数运算
该大整数运算系统用于对有符号的位数不超过500位的大整数进行加.减.乘.除四则运算和计算N(0<=N<=10000)的阶乘.注意事项 : 1.操作期间,进行四则运算时若大整数为正数请 ...
随机推荐
- powerdesidgner1
'******************************************************************************'* File: comment2name ...
- nyoj-0708-ones(dp)
nyoj-0708-ones 题意:用1,+,*,(,). 这四个符号组成表达式表达数s(0 <= s <= 10000),且1最少时1的的个数 状态转移方程: dp[i] = min(d ...
- VS Code 常用快捷键
VS Code 常用快捷键 1.注释: 单行注释:ctrl+/, 注释后再按取消 取消单行注释:alt+shift+A 注释后再按取消 2.移动行 向上移动一行:alt+up 向下移动一行:alt+d ...
- day6-if,while,for的快速掌握
python的缩进和冒号 python之所以如此简单,归功于它的缩进机制,严格的缩进机制是的代码非常整齐规范,赏心悦目,提高了可读性,在一定意义上提高了可维护性,但对于从其他语音转过来的朋友如:jav ...
- Date和 Calendar
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- 使用perfect进行服务端开发
最近闲来无事,研究了下基于perfect的swift后端开发.根据大神的博客进行了简单的配置,加深下印象也算是和各位分享一下. 参考博客:http://www.cnblogs.com/ludashi ...
- Toy Factory
Factory is a design pattern in common usage. Please implement a ToyFactory which can generate proper ...
- session和cokkie的区别与作用
session在计算机中,尤其是在网络应用中,称为“会话机制”,Session对象存储特定用户会话所需的属性及配置信息,这样,当用户在应用程序的web页之间跳转时,存储在session对象中的变量将不 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace
There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy ...
- Asp.Net MVC3.0中防止跨站的POST
在Form中添加 @Html.AntiForgeryToken(); 在后台的Action中增加 [ValidateAntiForgeryToken] 这个方法还可以添加自定义的参数 @Html.An ...