iostream — умножение двух больших чисел в C / Stack Overflow

Я пытался найти решение для этого … двух больших чисел, a а также b представлены char[] или же char* и цель состоит в том, чтобы умножить их на третий указатель, char* c:

void multiply( const char* a, const char* b ){
int len_a = strlen( a );
int len_b = strlen( b );
int* c = new int[ len_a + len_b];
memset( c, 0, sizeof(int) * ( len_a + len_b ));

for( int i = len_a - 1; i >= 0; i-- ){
for( int j = len_b - 1; j >= 0; j-- ){
c[ i + j + 1 ] += ( b[ j ] - '0') * ( a[ i ] - '0' );
}
}

for( int i = len_a + len_b; i >= 0; i-- ){
if( c[ i ] >= 10 ){
c[ i - 1 ] += c[ i ] / 10;
c[ i ] %= 10;
}
}

cout << a << " * " << b << " = " << c << endl;
delete[] c;
}

Я написал вышеупомянутую функцию, чтобы сделать эту операцию для меня … однако, когда я использую входы:

int main( void ){
const char* a = "999";
const char* b =  "99999";
multiply( a, b );
// I expect the answer to be 1 and 6
// profit = 0.92
return 0;
}

Я получил:

999 * 99999 = 0x100100080

Почему я получаю адрес памяти, а не фактический номер?
Спасибо!

1

Решение

Так как c является указателем на int, и потоковый оператор для cout напечатает адрес памяти, если передан такой указатель. Чтобы получить значение, вам нужно разыменовать указатели, например, с помощью *c, Вам, вероятно, понадобится написать цикл, чтобы вывести всю «строку» целых чисел.

3

Другие решения

cout << a << " * " << b << " = ";
for( int i = 0; i < len_a + len_b; i++ ){
cout << c[ i ];
}

cout << endl;

даст желаемый результат …

1

Ваша логика верна.
Просто быстрое напоминание: когда вы создаете целочисленный указатель и хотите использовать его в качестве массива, он указывает на «первый элемент массива», поэтому при его печати вы видите адрес первого элемента массива c, который «0x100100080» в вашем случае.

Чтобы напечатать число (символы), хранящиеся в c, вам нужно отменить ссылку на указатель, то есть распечатать элементы в массиве один за другим. Или же вы можете преобразовать ваш массив в число и распечатать его сразу. Для последнего, пожалуйста, обратитесь к: Как преобразовать массив целых чисел в целое число в C?.
Для печати символов по одному вы можете заменить

std::cout<<c;

со следующим кодом:

int n=strlen(c);
for(int i=0; i<n; i++) {
std::cout<<c[i];
}

Это напечатает номер.

1

std::ostream (какого типа std::cout is) не имеет перегруженных операторов специально для int*Таким образом, он возвращается к void* перегрузка, которая просто выводит значение указателя в зависимости от реализации.

Кроме того, это было бы невозможно для int* перегрузка, чтобы определить, что указатель указывает на массив, и, кроме того, сколько элементов будет иметь такой массив.

0

для (C ++ 14)
мы можем использовать повышение библиотеки ..

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision;
int main()
{
mp::cpp_int s1("12368123681263817263863821638126328136218362182");
mp::cpp_int s2("345897937325785470923092923709887329092470423707534025");
mp::cpp_int S=s1*s2;
std::cout << S << '\n';
}
0
Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.