大数加算の原理とコード(杭電OJ上AC過の)実現
2825 ワード
C++では、int型データが表す範囲は限られており、-2^32~2^32-1のみであり、より大きな数(すなわち、ここで議論する大きな数)の演算を行う場合、int型データは私たちのニーズを満たすことができません.このとき,我々は大数加算の原理を把握して演算を行う.
本論文では,加算を行う2つの大数の原理,他の演算原理と加算の類似についてのみ論じた.
まず,計算結果を1つの整数配列で格納するために2つの文字型配列が必要である.
次に,2つの文字型配列のサイズを比較し,ここでは2つのケースに分けて計算する.
配列の末尾から1ビットずつの対応加算が開始され、ここでの文字はASCIIコードであり、-48で演算され、1つのflag値がマークされ、加算値が10以上であればflagの値は1とマークされ、次のビットの演算が行われ、そうでなければ0とマークされる.
配列aが配列bより長いと仮定すると,上記の対応演算を行った後,配列aの多い部分にcを付与する.しかし同様にflagの問題を考慮する必要がある.bがaより長いのも同じ理屈だ
最後に、最後に得られた配列cが、キャリーの問題により、この2つの配列の最も長い1つよりも1つ大きいかどうかを決定する必要があります.この場合、対応する処理が行われます.
私たちは最初はcの具体的な長さを知らなかったので、値を割り当てるとき、a,bは末尾から、cはトップから順にa,b演算の値を受け取るので、出力するときはcに逆順序で出力する必要があります.ここで、私はcの値を新しい整数配列dに逆叙述して割り当てました.そしてdを順番に出力します(ええ、これは面倒なようですが、その時はそう思っていました.子供靴たちは直接cを順番に出力することができます).
さて、以上は私が皆さんと分かち合う大数を加えて、入門したばかりの白さんは参考にすることができて、そこからいくつかのものを悟るかもしれません.大神は私が書くのがよくないことを吹き飛ばさないでくださいを見て、私もちょうど学んで間もなく、技術はゆっくりと向上する必要があります.とにかく、プログラミングが好きな子供靴たちと私の交流討論を歓迎します.
本論文では,加算を行う2つの大数の原理,他の演算原理と加算の類似についてのみ論じた.
まず,計算結果を1つの整数配列で格納するために2つの文字型配列が必要である.
次に,2つの文字型配列のサイズを比較し,ここでは2つのケースに分けて計算する.
配列の末尾から1ビットずつの対応加算が開始され、ここでの文字はASCIIコードであり、-48で演算され、1つのflag値がマークされ、加算値が10以上であればflagの値は1とマークされ、次のビットの演算が行われ、そうでなければ0とマークされる.
配列aが配列bより長いと仮定すると,上記の対応演算を行った後,配列aの多い部分にcを付与する.しかし同様にflagの問題を考慮する必要がある.bがaより長いのも同じ理屈だ
最後に、最後に得られた配列cが、キャリーの問題により、この2つの配列の最も長い1つよりも1つ大きいかどうかを決定する必要があります.この場合、対応する処理が行われます.
私たちは最初はcの具体的な長さを知らなかったので、値を割り当てるとき、a,bは末尾から、cはトップから順にa,b演算の値を受け取るので、出力するときはcに逆順序で出力する必要があります.ここで、私はcの値を新しい整数配列dに逆叙述して割り当てました.そしてdを順番に出力します(ええ、これは面倒なようですが、その時はそう思っていました.子供靴たちは直接cを順番に出力することができます).
さて、以上は私が皆さんと分かち合う大数を加えて、入門したばかりの白さんは参考にすることができて、そこからいくつかのものを悟るかもしれません.大神は私が書くのがよくないことを吹き飛ばさないでくださいを見て、私もちょうど学んで間もなく、技術はゆっくりと向上する必要があります.とにかく、プログラミングが好きな子供靴たちと私の交流討論を歓迎します.
, AC ~~
#include
#include
#include
#include
using namespace std;
int main()
{
int T;
cin>>T;
int TT=T;
while(T--)
{
int flag;
char a[1000],b[1000];
int c[1001],d[1001];
scanf("%s %s",a,b);
int lena,lenb;
lena=strlen(a);
lenb=strlen(b);
int lenc;
if(lena>=lenb)
{
int ab=lena-lenb;
flag=0;
int i,j;
for(i=lenb-1,j=0;i>=0;i--,j++)
{
if((a[i+ab]-48+b[i]-48+flag)>=10)
{
c[j]=a[i+ab]-48+b[i]-48+flag-10;
flag=1;
}
else
{
c[j]=a[i+ab]-48+b[i]-48+flag;
flag=0;
}
}
for(int k=ab-1;k>=0;k--,j++)
{
if((a[k]-48+flag)>=10)
{
c[j]=a[k]-48+flag-10;
flag=1;
}
else
{
c[j]=a[k]-48+flag;
flag=0;
}
}
lenc=j;
if(ab==0)
{
if((a[0]-48+b[0]-48+flag)>=10)
{
c[j]=1;
lenc++;
}
}
else
{
if((a[0]-48+flag)>=10)
{
c[j]=1;
lenc++;
}
}
}
else
{
int ab=lenb-lena;
flag=0;
int i,j;
for(i=lena-1,j=0;i>=0;i--,j++)
{
if((b[i+ab]-48+a[i]-48+flag)>=10)
{
c[j]=b[i+ab]-48+a[i]-48+flag-10;
flag=1;
}
else
{
c[j]=b[i+ab]-48+a[i]-48+flag;
flag=0;
}
}
for(int k=ab-1;k>=0;k--,j++)
{
if((b[k]-48+flag)>=10)
{
c[j]=b[k]-48+flag-10;
flag=1;
}
else
{
c[j]=b[k]-48+flag;
flag=0;
}
}
lenc=j;
if(ab==0)
{
if((a[0]-48+b[0]-48+flag)>=10)
{
c[j]=1;
lenc++;
}
}
else
{
if((b[0]-48+flag)>=10)
{
c[j]=1;
lenc++;
}
}
}
for(int cc=lenc-1,int dd=0;cc>=0;cc--,dd++)
{
d[dd]=c[cc];
}
cout<