Я пытался найти решение для этого … двух больших чисел, 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
Почему я получаю адрес памяти, а не фактический номер?
Спасибо!
Так как c
является указателем на int, и потоковый оператор для cout напечатает адрес памяти, если передан такой указатель. Чтобы получить значение, вам нужно разыменовать указатели, например, с помощью *c
, Вам, вероятно, понадобится написать цикл, чтобы вывести всю «строку» целых чисел.
cout << a << " * " << b << " = ";
for( int i = 0; i < len_a + len_b; i++ ){
cout << c[ i ];
}
cout << endl;
даст желаемый результат …
Ваша логика верна.
Просто быстрое напоминание: когда вы создаете целочисленный указатель и хотите использовать его в качестве массива, он указывает на «первый элемент массива», поэтому при его печати вы видите адрес первого элемента массива c, который «0x100100080» в вашем случае.
Чтобы напечатать число (символы), хранящиеся в c, вам нужно отменить ссылку на указатель, то есть распечатать элементы в массиве один за другим. Или же вы можете преобразовать ваш массив в число и распечатать его сразу. Для последнего, пожалуйста, обратитесь к: Как преобразовать массив целых чисел в целое число в C?.
Для печати символов по одному вы можете заменить
std::cout<<c;
со следующим кодом:
int n=strlen(c);
for(int i=0; i<n; i++) {
std::cout<<c[i];
}
Это напечатает номер.
std::ostream
(какого типа std::cout
is) не имеет перегруженных операторов специально для int*
Таким образом, он возвращается к void*
перегрузка, которая просто выводит значение указателя в зависимости от реализации.
Кроме того, это было бы невозможно для int*
перегрузка, чтобы определить, что указатель указывает на массив, и, кроме того, сколько элементов будет иметь такой массив.
для (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';
}