説明
プログラムは空白を埋め、指定された結果を出力します
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int MAX = 110;
class CHugeInt {
// 在此处补充你的代码
};
int main()
{
char s[210];
int n;
while (cin >> s >> n) {
CHugeInt a(s);
CHugeInt b(n);
cout << a + b << endl;
cout << n + a << endl;
cout << a + n << endl;
b += n;
cout << ++ b << endl;
cout << b++ << endl;
cout << b << endl;
}
return 0;
}
入力例
99999999999999999999999999888888888888888812345678901234567789 12
6 6
出力例
99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
25
25
26
12
12
12
13
13
14
分析:
- コンストラクタ
CHugeInt(char* s)
とCHugeInt(int n)
- オーバーロードされた演算子
CHugeInt& operator+(cosnt CHugeInt& c)
クラス+クラス
CHugeInt operator+(int n)
クラス+ int
friend CHugeInt operator+(int n,CHugeInt& c)
int +クラス
CHugeInt operator+=(int n)
+ =
CHugeInt operator++()
フロント++
CHugeInt operator++(int)
ポスト++
friend ostream& operator<<(ostream& os,const CHugeInt c)
ストリームの挿入
戻り値または参照について詳しく説明します- 困難は、加算の計算方法にあります。
まず最初に、配列を逆順にして、順序どおりに計算できるようにします。次に、使用される方法は、コンピューターシステムの全加算器(1)、3つの入力(s1、s2およびキャリービフォアキャリー)、および2つの出力(合計およびキャリーキャリー)を考慮しています。どちらも一時オブジェクトを作成し、次に一時オブジェクトを作成して構造を保存します。2つのクラスオブジェクトの配列の対応する要素を表す2つの文字を設定し、一時的にint kに設定します。次に、
k= c1+c2-'0' -'0'+carry
kが10以上かどうかを判断し、次のビットキャリーを検討します。
終了条件は、c1 \ c2 \ carryが0のときに終了することです。ここで0は、nullポインタがcharを意味することも意味します。
private:
char ch[210];
public:
void reverse(char *ch)
{
int i=0, j=strlen(ch)-1;
for(;i<=j;i++,j--)
swap(ch[i],ch[j]);
}
CHugeInt(const char* s)
{
memset(ch,'\0',sizeof(ch));
strcpy(ch,s);
reverse(ch);
}
CHugeInt(int n)
{
memset(ch,'\0',sizeof(ch));
sprintf(ch,"%d",n);
reverse(ch);
}
CHugeInt operator+(const CHugeInt& c)
{
CHugeInt temp(0);
int carry=0;
for(int i=0;i<210;i++)
{
char c1= ch[i];
char c2= c.ch[i];
cout<<c1<<" "<<c2<<endl;
if(c1==0&c2==0&&carry==0)
break;
if(c1==0)
c1='0';
if(c2==0)
c2='0';
int k = c1-'0'+c2-'0'+carry;
if(k>=10)
{
k=k%10;
temp.ch[i] = k+'0';
carry =1;
}
else
{
carry = 0;
temp.ch[i] = k+ '0';
}
}
return temp;
}
CHugeInt operator+(int n)
{
return *this + CHugeInt(n);
}
friend CHugeInt operator+(int n,CHugeInt& c)
{
return c + CHugeInt(n) ;
}
CHugeInt& operator+=(int n)
{
*this= *this + n;
return *this;
}
CHugeInt& operator++()
{
*this = *this + 1;
return *this ;
}
CHugeInt operator++(int a)
{
CHugeInt temp(*this);
*this = temp+CHugeInt(1);
return temp;
}
friend ostream& operator<<(ostream& os,const CHugeInt& h)
{
for(int i=strlen(h.ch)-1;i>=0;i--)
os<<h.ch[i];
return os;
}
- 新たに学習機能は
memset(char*,char,sizeof(char_arr)
、CHAR、すべての配列に設定してある
sprintf(char*,"%d",int)
のchar *に文字列として書き込みint型にあり、
swap(char* s1,char* s2)
交換することです
返されるtempは一時オブジェクトであるため、どのような戻りクラス+クラス戻り値。
戻り値の記述方法に応じて、他の戻り値または参照は、たとえば
return *this+1
戻り値メンバー関数(クラス+クラス)であるため、値を返す必要があります。 )
*this = *this+1; return *this
参照を返すことができます。