两个大数相乘的C++实现
2012-04-22 19:41
751 查看
#include <iostream> #include <string.h> #include <cassert> class BigIntegerMultiplier { private: /// 判断两个字符串可不可以表示一个整数 static inline bool isNumber(const char* s) { if(0 == s || '\0' == *s++) return false; while('\0' != *s) { if(*s < '0' || *s > '9') return false; ++s; } return true; } /// 判断字符s是否为一个整数 static inline bool isNumber(char s) { return s > '9' || s < '0' ? false : true; } /** * 将一个数num加到另一个大数上result的pos位置上 * 函数内部使用递归来处理进位的问题 * */ static void add(char num, char* result, unsigned int pos) { if(!isNumber(num)) return; int sum = (num - '0' ) + (result[pos] - '0'); if(sum < 10) { result[pos] = sum + '0'; return; } result[pos] = '0' + sum - 10; add('1', result, pos - 1); } /** * 将一个小数num(0到9)与大数s相乘,并把结果保存到result中。result的startPos位置表示result的个位所在的位置。 * */ static void multiply(const char* s, char num, char* result, unsigned int startPos) { if(!isNumber(s) || !isNumber(num)) return; unsigned int len = strlen(s); unsigned int j = len - 1; int number(num - '0'); while (j >= 0) { int sum = (s[j] - '0') * number; if(sum < 10) { add(sum + '0', result, startPos); } else { add(sum % 10 + '0', result, startPos); add(sum / 10 + '0', result, startPos - 1); } if(0 == j) return; --startPos; --j; } } //// 剔除数s中最高位为0的部分。 static void deleteZeros(char* s) { if (0 == s || *s == '\0' || *s != '0') { return; } // the string s represents a zero number. if(*s == '0' && *(s + 1) == '\0') { return; } char* temp = s; while(*temp == '0' && *temp != '\0') { ++temp; } if(*temp == '\0') { s[1] = '\0'; } while(*temp != '\0') { *s++ = *temp++; } *s = *temp; // '\0' } public: /** * 程序的入口。 * **/ static char* multiply(const char* s1, const char* s2) { if(!isNumber(s1) || !isNumber(s2)) return 0; char* result = new char[strlen(s1) + strlen(s2) + 1]; if(0 == result) return 0; memset(result, '0', sizeof(char) * (1 + strlen(s1) + strlen(s2))); result[strlen(s1) + strlen(s2)] = '\0'; unsigned int len(strlen(s2)); unsigned int j = len - 1; unsigned int resStartPos = strlen(s1) + strlen(s2) - 1; while(j >= 0) { multiply(s1, s2[j], result, resStartPos); if(0 == j) break; --j; --resStartPos; } deleteZeros(result); return result; } }; //// 打印数字 void printNumber(const char* s) { if (0 == s) { return; } while(*s != '\0') { std::cout << *s++; } } int main(int argc, char** argv) { const char* number1 = "123456789"; const char* number2 = "123456789"; char* result = BigIntegerMultiplier::multiply(number1, number2); assert(0 != result); /// 输出结果 printNumber(number1); std::cout << " * "; printNumber(number2); std::cout << " = "; printNumber(result); std::cout << std::endl; delete[] result, result = 0; return 0; }
程序输出结果:123456789 * 123456789 = 15241578750190521
相关文章推荐
- C++实现——两个大数相乘
- 实现两个大数相乘
- 两个大数相乘(纯C实现)
- C++实现的大数相乘算法示例
- C++实现大数相乘
- 大数相乘 C++实现
- C++实现的一个简单两个大数相加程序!
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
- C语言实现两个大数相乘问题
- 海豚实习-实现两个大数相乘
- Java实现两个大数相乘
- 大数相乘 C++实现
- JS实现两个大数(整数)相乘 实例代码
- 深入分析C++中两个大数相乘结果不正确的问题
- [转] 一个大数相乘的C/C++实现
- 算法:C++实现大数相乘
- 杭电oj1002即用c++实现两个大数相加
- C语言实现两个大数相乘
- C++ 实现大数相乘