大数的加减乘除
2015-11-28 16:05
459 查看
最近学运算符重载有题是关于大数的加减乘除的,先占个坑,一会填
题目
参考1
参考1除法效率吓哭我了,下面直接贴出他的代码
我尝试改他的除法没有改成功,我不会放弃的,先放一会~~~
参考2
额,参考二直接看吧
参考3
参考3后来看见的,好像不错
参考4
现在才看见,ORZ,方法都大同小异
下面是我改别人的代码之后AC的,哭~~~
先占个坑,
相关链接
题目
参考1
参考1除法效率吓哭我了,下面直接贴出他的代码
我尝试改他的除法没有改成功,我不会放弃的,先放一会~~~
#include<iostream> #include<cstring> using namespace std; const int MAXLEN = 205; int i; class Integer{ private: int is_neg; int len; int s[MAXLEN]; char str[MAXLEN]; public: Integer(const char * string = ""){ memset(s,0,MAXLEN*sizeof(int)); memset(str,0,MAXLEN*sizeof(char)); strcpy(str,string); is_neg = 0; len = strlen(str); for(i = 0;i < len;i++) s[i] = int(str[len - 1 - i]) - 48; } Integer &operator=(const Integer & oth){ if(this == &oth) return *this; memset(s,0,MAXLEN*sizeof(int)); memset(str,0,MAXLEN*sizeof(char)); is_neg = oth.is_neg; len = oth.len; for(i = 0;i < oth.len;i++) s[i] = oth.s[i]; strcpy(str,oth.str); return *this; } bool operator==(const Integer & oth){ if(this == &oth) return true; bool ret = true; if(len != oth.len || is_neg != oth.is_neg) ret = false; if(strcmp(str,oth.str)) ret = false; for(int i = 0;i < oth.len;i++){ if(s[i] != oth.s[i]) ret = false; } return ret; } bool operator!=(const Integer & oth){ return !(*this == oth); } Integer operator+(const Integer & oth){ Integer c; int length = len >= oth.len ? len : oth.len; length += 1; c.len = length; for(i = 0;i < c.len;i++){ c.s[i] += s[i] + oth.s[i]; c.s[i + 1] += c.s[i] / 10; c.s[i] = c.s[i] % 10; } if((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--; int k = 0; for(i = c.len - 1;i >= 0;i--){ c.str[k++] = (char)(c.s[i] + 48); } return c; } Integer operator-(const Integer &oth){ Integer c; int flag = 0; if(len > oth.len) flag = 1; else if(len < oth.len) flag = -1; else flag = strcmp(str,oth.str); if(flag >= 0){ c.len = len; int borrow = 0; for(i = 0;i < c.len;i++){ c.s[i] += s[i] - oth.s[i]; if(borrow) c.s[i] -= 1; if(c.s[i] < 0){ c.s[i] += 10; borrow = 1; }else borrow = 0; } while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--; }else{ c.is_neg = 1; c.len = oth.len; int borrow = 0; for(i = 0;i < c.len;i++){ c.s[i] += oth.s[i] - s[i]; if(borrow) c.s[i] -= 1; if(c.s[i] < 0){ c.s[i] += 10; borrow = 1; }else borrow = 0; } while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--; } int k = 0; for(i = c.len - 1;i >= 0;i--){ c.str[k++] = (char)(c.s[i] + 48); } return c; } Integer operator*(const Integer & oth){ Integer c; c.len = len + oth.len + 1; for(i = 0;i < len;i++){ for(int j = 0;j < oth.len;j++){ c.s[i + j] += s[i] * oth.s[j]; c.s[i + j + 1] += c.s[i + j] / 10; c.s[i + j] = c.s[i + j] % 10; } } while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--; int k = 0; for(i = c.len - 1;i >= 0;i--){ c.str[k++] = (char)(c.s[i] + 48); } return c; } Integer operator/(const Integer &oth){ Integer c("0"); int flag = 0; if(len > oth.len) flag = 1; else if(len < oth.len) flag = -1; else flag = strcmp(str,oth.str); Integer one("1"); Integer zero("0"); Integer t; if(oth.len == 1&&oth.s[0] == 1) return *this; if(flag >= 0){ while(this->is_neg == 0&&*this != zero){ t = *this - oth; *this = t; c = c + one; } }else{ int k = 0; for(i = c.len - 1;i >= 0;i--){ c.str[k++] = (char)(c.s[i] + 48); } return c; } int k = 0; for(i = c.len - 1;i >= 0;i--){ c.str[k++] = (char)(c.s[i] + 48); } return c; } friend ostream & operator<<(ostream & out,const Integer & oth){ if(oth.is_neg) out << "-"; for(int k = oth.len - 1;k >= 0;k--) out << oth.s[k]; return out; } }; int main(){ char ch; Integer c; char s1[MAXLEN],s2[MAXLEN]; cin >> s1; cin >> ch; cin >> s2; Integer a(s1); Integer b(s2); switch(ch){ case '+':c = a + b;cout << c << endl;break; case '*':c = a * b;cout << c << endl;break; case '-':c = a - b;cout << c << endl;break; case '/':c = a / b;cout << c << endl;break; } return 0; }
参考2
额,参考二直接看吧
参考3
参考3后来看见的,好像不错
参考4
现在才看见,ORZ,方法都大同小异
下面是我改别人的代码之后AC的,哭~~~
先占个坑,
相关链接
#include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> using namespace std; void JIA(string s1,string s2) { string sp; if(s1.length() > s2.length()){ sp = s1; s1 = s2; s2 = sp; } string s(1000,'0'); reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); for(int j=0;j<s1.length();j++) s[j]=s1[j]; int temp=0; for(int k=0;k<s2.length();k++) { temp+=s[k]-48+s2[k]-48; s[k]=temp%10+'0'; temp/=10; } s[s2.length()]=s[s2.length()]-48+temp+48; reverse(s.begin(),s.end()); reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); cout<<s.substr(s.find_first_not_of('0'))<<endl; } int strComp(string &s1,string &s2) { int len1=s1.length(); int len2=s2.length(); if(len1>len2) return 0; else if(len1<len2) return 1; else{ if(s1>=s2) return 0; else return 1; } } void JIAN(string s1,string s2) { string s(10000,'0'); bool fgEx=true; if(strComp(s1,s2)==1) { string temp; temp=s1; s1=s2; s2=temp; fgEx=false; } if(s1==s2) { cout<<"0"<<endl; return; } reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); for(int i=0;i<s1.length();i++) s[i]=s1[i]; for(int i=0;i<s2.length();i++) { if(s[i]>=s2[i]) s[i]=s[i]-'0'-(s2[i]-'0')+'0'; else{ s[i+1]=s[i+1]-'0'-1+'0'; s[i]=s[i]-'0'+10-(s2[i]-'0')+'0'; } } if(fgEx==false) { reverse(s2.begin(),s2.end()); reverse(s1.begin(),s1.end()); reverse(s.begin(),s.end()); cout<<"-"<<s.substr(s.find_first_not_of('0'))<<endl; } else { reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); reverse(s.begin(),s.end()); cout<<s.substr(s.find_first_not_of('0'))<<endl; } } void CHENG(string s1,string s2) { string s(1000,'0'); reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); for(int i=0;i<s1.length();i++) for(int j=0;j<s2.length();j++) { int temp=(s1[i]-'0')*(s2[j]-'0'); s[i+j+1]=s[i+j+1]-'0'+(s[i+j]-'0'+temp)/10+'0'; s[i+j]=(s[i+j]-'0'+temp)%10+'0'; } reverse(s.begin(),s.end()); if(s.find_first_not_of('0')==string::npos) cout<<"0"<<endl; else cout<<s.substr(s.find_first_not_of('0'))<<endl; } string Sub(string s1,string s2) { if(strComp(s1,s2)==1) return "-1"; reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); string s(1000,'0'); for(int i=0;i<s1.length();i++) s[i]=s1[i]; for(int i=0;i<s2.length();i++) { if(s[i]>=s2[i]) s[i]=s[i]-'0'-(s2[i]-'0')+'0'; else{ s[i+1]=s[i+1]-'0'-1+'0'; s[i]=s[i]-'0'+10-(s2[i]-'0')+'0'; } } reverse(s.begin(),s.end()); if(s.find_first_not_of('0')==string::npos) return "0"; else return s.substr(s.find_first_not_of('0')); } void CHU(string s1,string s2) { string s(1000,'0'); if(strComp(s1,s2)==1) { cout<<"0"<<endl; return; } int len1=s1.length(); int len2=s2.length(); int dis=len1-len2; for(int i=0;i<dis;i++) s2+='0'; string ans(1000,'0'); while(dis>=0) { int sum=0; string temp; while((temp=Sub(s1,s2))!="-1") { sum++; s1=temp; } ans[ans.length()-dis-1]=sum+'0'; dis--; s2=s2.substr(0,len2+dis); } if(ans.find_first_not_of('0')==string::npos) cout<<"0"<<endl; else{ string res=ans.substr(ans.find_first_not_of('0')); cout<<res<<endl; } } int main(){ string s1,s2; char ch; cin >> s1 >> ch >> s2; if(ch == '+') JIA(s1,s2); if(ch == '-') JIAN(s1,s2); if(ch == '*') CHENG(s1,s2); if(ch == '/') CHU(s1,s2); return 0; }
相关文章推荐
- 基于 Windows 7 的计算机的可用内存可能低于安装内存
- [转]session 持久化问题(重启服务器session 仍然存在)
- poj3708(公式化简+大数进制装换+线性同余方程组)
- empty和isset函数实验比较差别
- 1.通过原始的Driver接口获取JDBC数据库连接Connection
- sql字段null参与运算 sql date
- 百度地图API示例之设置地图显示范围
- Java语法基础
- 搞机进行时,树莓派2打造高性能openwrt路由器
- Unity官方实例教程 Roll-a-Ball(二)
- Apple TV编程指南:检测手势和按钮按压
- 《HeadFirst SQL》笔记
- Ugly Number
- javascript利用正则获取第一根斜线后的内容
- Apple TV编程指南:使用Apple TV遥控器控制屏幕上的用户界面
- bind,apply,call的区别
- 多线程之:多线程的优缺点
- 1-3-15:苹果和虫子
- 基于PSR-0标准的自动载入范例
- Codeforces Round#225 div.2E Propagating tree 线段树