018:呼び出さないでください。この大きな整数は単純化されています!

説明
プログラムは空白を埋め、指定された結果を出力します

#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

分析:

  1. コンストラクタCHugeInt(char* s)CHugeInt(int n)
  2. オーバーロードされた演算子
    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)ストリームの挿入
    戻り値または参照について詳しく説明します
  3. 困難は、加算の計算方法にあります。
    まず最初に、配列を逆順にして、順序どおりに計算できるようにします。次に、使用される方法は、コンピューターシステムの全加算器(1)、3つの入力(s1、s2およびキャリービフォアキャリー)、および2つの出力(合計およびキャリーキャリー)を考慮しています。どちらも一時オブジェクトを作成し、次に一時オブジェクトを作成して構造を保存します。2つのクラスオブジェクトの配列の対応する要素を表す2つの文字を設定し、一時的にint kに設定します。次に、
    k= c1+c2-'0' -'0'+carrykが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;
		}
  1. 新たに学習機能は
    memset(char*,char,sizeof(char_arr)、CHAR、すべての配列に設定してある
    sprintf(char*,"%d",int)のchar *に文字列として書き込みint型にあり、
    swap(char* s1,char* s2)交換することです

  2. 返されるtempは一時オブジェクトであるため、どのような戻りクラス+クラス戻り値。
    戻り値の記述方法に応じて、他の戻り値または参照は、たとえば
    return *this+1戻り値メンバー関数(クラス+クラス)であるため、値を返す必要があります。 )
    *this = *this+1; return *this参照を返すことができます。

おすすめ

転載: blog.csdn.net/ZmJ6666/article/details/108577334