2

私はプログラミングに比較的慣れていません:)。

ユーザーに 50 桁までの正の数を 2 つ入力させ、最初の数から 2 番目の数を引くプログラムを作成したいとします。

例えば:

ユーザーは最初の正の数を入力します: 239834095803945862440385983452184985298358

2 番目の番号: 939542309853120721934217021372984729812

================================================== =========================

プログラムは差を出力します: 238894553494092741718901766430812000568564

または、負の場合: -29837430045

================================================== =========================

数値の各桁は、配列内の個々の要素として格納されます。現在、ユーザー入力をどのように取り入れているかを次に示します。

int read_array(int int_array[], int MAX_SIZE) {
    char number;
    int count = 0;
    //set all array entries to 0. 
    for (int i = 0; i < MAX_SIZE; i++){
        int_array[i] = 0;
    }

    do { //processes each individual char in the istream
        cin.get(number);
        // puts char on to the array until it hits the
        // end of the number (end of the line)
        if(( number != '\n') && (count < MAX_SIZE) && (isdigit(number))) {
            int_array[count] = int(number) - int('0');
        }  
        count++; //increments count
    } while (number != '\n');

    //tests if number is too large
    int digitcount = count - 1;
    if (digitcount > MAX_SIZE) {
        cout << endl << "ERROR: The number is above 50 digits!" << endl;
        return 0;
    }

問題:

私はこの問題を 2 週間解決しようとしてきましたが、おそらく些細なことで、私が見逃したものです

私が試してみました:

  1. 要素の配列を 1 つの整数全体に変換する
  2. 数値の長い減算を行う独自のプログラムを作成する

等...

ただし、出力は特定の桁数まで、および/またはそれらが正/負の数である場合にのみ成功します。私は困惑しており、例に示すように、2 つの正の数値配列を減算して、正と負の数値に対応できる成功した出力を得ることが最善の方法であることがわかりません。どんな助けでも大歓迎です:)。

編集:私の試み:

#include "long_sub.h"
#include <sstream>
#include <vector>

using namespace std;

int long_sub(int a[], int b[], const int size) {
    stringstream ss;
    int const sizes = 50;
    int c = 0; //borrow number
    int borrow = 1; // the '1' that gets carried to the borrowed number
    int r[sizes];

    for (int i = 0; i < size; i++) {
        r[i] = 0;
    }    
    //initialise answer array to 0.
    for (int i = size - 1; i >= 0; i--) {
        //handles zeros
        if (a[i] < b[i] && a[i]) {
            //takes the borrow from the next unit and appends to a.
            ss << borrow << a[i];
            ss >> c;
            ss.clear(); // clears stringstream for next potential borrow.

            int temp = c - b[i];
            r[i] = abs(temp);
        } else {
            int temp = a[i] - b[i];
            r[i] = abs(temp);
        }
    }

    for (int i = 0; i <= size - 1; i++ ) {
        cout << r[i];
    }
    cout << endl;
    return r[sizes];
}
4

1 に答える 1

4

したがって、これに対する解決策は、手動で行う場合とほとんど同じです。

私たちが持っている場合:

 4321
-1234

2 つの数字の最後の数字を取り、上の数字から下の数字を引きます。1 - 4これはもちろん、次の数字から借りなければならないことを意味するので、それを思い出してから、7 を考え出します。次の数字を取り [そして「借りる」ことを覚えておいてください]、2-1 = 8 から 3 を引きます。

まったく同じことは、コンピューターで大きな数の引き算を行う方法です。一度に 1 ビットずつ行い、「借りる」場合は、それを次のステップに持ち込む必要があります。

于 2013-02-14T13:07:03.853 に答える