アルゴリズムの大数演算加減法ソースコード
20741 ワード
多くの小さなパートナーはコンピュータのプログラミングのアルゴリズムに興味を持っていますが、多くのコンテスト類のアルゴリズムのウェブサイトでは、大数演算は往々にして必ず試験されますが、教科書には基本的な言及がありませんので、今日はアルゴリズムの基本演算のソースコード(加減)を提供します.大数演算の多くはintの範囲を超えていることが多い.例えば、2の100回、100の100回など、あるいは問題メモリの制限を超えている場合、大数演算は大きく活躍するが、実は、大数演算は文字列の演算であり、構造体と結合している.だから、文字列と構造体に慣れていない仲間は、まずこの2つの知識点を復習することをお勧めします.くだらないことは言わないで、コードを捧げます
仲間たちはゆっくり噛んでこれらの知識を消化しましょう.
#include
#include //
using namespace std;
struct beg //
{
int d[1000]; //
int len; //
beg() //
{
memset(d,0,sizeof(d));
len=0;
}
};
struct beg change(char str[]);
struct beg add(beg a,beg b);
struct beg sub(beg a,beg b);
void show(struct beg c);
int com(beg a,beg b);
int main()
{
beg a,b,c;
char str1[1000],str2[1000];
cin>>str1;
cin>>str2;
a=change(str1);
b=change(str2);
c=add(a,b);
show(c);
int i;
i=com(a,b);
if(i<0) // ,
{
struct beg temp;
temp=a;
a=b;
b=temp;
c=sub(a,b);
cout<<"-"; //
show(c);
}
else
{
c=sub(a,b);
show(c);
}
return 0;
}
// ,
struct beg change(char str[])
{
beg a;
a.len=strlen(str);
for(int i=0;i<a.len;i++)
{
a.d[i]=str[a.len-i-1]-'0'; //
}
return a;
}
//
struct beg add(beg a,beg b)
{
beg c;
int carry=0; //carry , 0
for(int i=0;i<a.len||i<b.len;i++)
{
int temp=a.d[i]+b.d[i]+carry; //
c.d[c.len++]=temp%10; //
carry=temp/10; //
}
if(carry!=0) // 0
{
c.d[c.len++]=carry;
}
return c;
}
// ( )
struct beg sub(beg a,beg b)
{
beg c;
for(int i=0;i<a.len||i<b.len;i++)
{
if(a.d[i]<b.d[i]) //
{
a.d[i+1]--; // 1
a.d[i]+=10; // 10
}
c.d[c.len++]=a.d[i]-b.d[i]; //
}
while(c.len-1>=1&&c.d[c.len-1]==0)
{
c.len--; // 0 ,
}
return c;
}
//
void show(struct beg c)
{
for(int i=c.len-1;i>=0;i--)
{
cout<<c.d[i];
}
cout<<endl;
}
//
int com(beg a,beg b)
{
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else
{
for(int i=a.len-1;i>=0;i--)
{
if(a.d[i]<b.d[i]) return -1;
else if(a.d[i]>b.d[i]) return 1;
}
}
return 0;
}
仲間たちはゆっくり噛んでこれらの知識を消化しましょう.