在C/C++中乘以两个大数字
multiplying two large numbers in C / C++
我正试图想出解决方案。。。两个大数字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
)没有任何专门针对int*
的重载运算符,因此它又回到了void*
重载,后者只是以实现定义的方式输出指针值。
此外,int*
重载不可能确定指针指向一个数组,以及这样一个数组将有多少元素。
对于(c++14)我们可以使用boost libarary。。
#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';
}
相关文章:
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 两个数字的对称配对功能
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 我应该如何使用remove_if删除两个数字范围内的元素
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 子数组中两个数字的相同出现(连续)
- 如何使用位操作在单个整数中编码和解码两个数字
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 钻头以两个数字替换位
- C 如何在小数系统中添加两个数字
- 为什么我的代码不给最后两个数字
- 如何在给出前两个数字的级数中找到大于 x 的第 n 个最小子数组总和?
- 输入两个数字后程序关闭
- 代码是否交换数组的两个数字