大数乘法的实现
2009-12-08 17:56
417 查看
1234567890987654321234567890987654321 x 2345678909876543211234567890987654321
这是一道乘法题。
一开始我们讨论用一个char类型来代表2位数,因为一个char最大可以表示255。后来我们觉得这样不行,因为,进位的时候会非常麻烦。最后折中,用一个char表示1位。
最后的解决方案是这样的:
欢迎拍砖
这是一道乘法题。
一开始我们讨论用一个char类型来代表2位数,因为一个char最大可以表示255。后来我们觉得这样不行,因为,进位的时候会非常麻烦。最后折中,用一个char表示1位。
最后的解决方案是这样的:
#include <iostream> #include <memory.h> #include <string.h> using namespace std; bool buffer_init(char*); char* single_mult(char*, char*); /** * @fun-name: single_mult * @parameter1: >char* 乘数 * @parameter2: >char* 被乘数 * @return char*: 返回结果的缓冲区地址 */ char* single_mult (char* para1, char* para2) { int len_para1 = strlen(para1); int len_para2 = strlen(para2); int top = len_para1 + len_para2 - 1; cout << "size of para1 is " << len_para1 << endl; cout << "size of para2 is " << len_para2 << endl; char* result = new char[len_para1 + len_para2]; memset(result, 0, len_para1 + len_para2); char* tempBuffer = new char[len_para1]; cout << (8/10) << endl; for (int i = len_para2-1; i >= 0; i-- ) { // 将para2中的每一位与para1的每一位去相乘 // 并将结果保存在一个临时缓冲区中。 for (int j = len_para1-1; j >= 0 ; j--) { tempBuffer[j] = (para1[j] - '0') * (para2[i] - '0'); cout << (int)tempBuffer[j] << ' '; } cout << endl; // 将结果移位相加 for (int j = len_para1-1; j >= 0; j--) { result[i+j+1] += tempBuffer[j]; cout << (int)result[i+j+1] << ' '; } cout << endl; for (int j = len_para1-1; j >= 0; j--) { if ( (result[j+i+1] / 10) > 0) { cout << "进位操作" << (int)result[j+i+1] << endl; result[j+i] += result[j+i+1] / 10; result[j+i+1] = result[j+i+1] % 10; } } } delete [] para1; delete [] para2; delete [] tempBuffer; return result; } int main(){ char* para1 = "123456789"; char* para2 = "987654321"; int length = strlen(para1) +strlen(para2); char * result = single_mult(para1, para2); for ( int i = 0; i < length; i++) { cout << (int)result[i]; } delete [] result; return 0; }
欢迎拍砖