您的位置:首页 > 其它

大数的加减乘除

2015-11-28 16:05 459 查看
最近学运算符重载有题是关于大数的加减乘除的,先占个坑,一会填

题目

参考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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: