Я относительно новичок в программировании :).
Предположим, я хотел создать программу, которая предлагает пользователю ввести два положительных числа длиной до 50 цифр, которые затем вычитают второе число из первого числа.
Например:
Пользователь вводит первое положительное число: 239834095803945862440385983452184985298358
второй номер: 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;
}
ПРОБЛЕМА:
КАК делать вычитание ускользает от меня. Я пытался решить эту проблему в течение двух недель, и, скорее всего, я упустил что-то тривиальное.
Я пытался:
- Преобразование массива элементов обратно в одно целое int
- Написание собственной программы для долгого вычитания чисел
и т.д...
Однако вывод будет успешным ТОЛЬКО до определенного количества цифр и / или если они положительные / отрицательные числа. Я в тупике и не уверен, как лучше всего вычесть два массива положительных чисел, чтобы получить успешный результат, который может учитывать положительные и отрицательные числа, как показано в примере. ЛЮБАЯ ПОМОЩЬ БЛАГОДАРЮ :).
РЕДАКТИРОВАТЬ: мои попытки:
#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];
}
8-9
, затем за27-46
. Должен заставить тебя идти. - person Peter Wood   schedule 14.02.2013stringstream::clear
не очищает его от содержимого, он очищает биты ошибок. Чтобы сделать его пустым, используйтеss.str("");
- person Peter Wood   schedule 14.02.2013r[sizes]
переполнит буфер. - person Peter Wood   schedule 14.02.2013