面试题之自创 实现两个整型大数(都是正数)的相减操作
2013-12-31 08:36
459 查看
非常大的正整数相减求差
#include <iostream> #include <string> using namespace std; // extra the class of string class String:public string { public: // mode the add of int static string Add(string a,string b) { // exception of input if( a.empty() ) return b; else if( b.empty() ) return "0"; if(!check_all_number(a) || !check_all_number(b)) { return "exception of input add"; } Standardization(a); Standardization(b); string::size_type i = a.size()-1 ,j = b.size()-1 , k = 0 ; string c = ""; int jinwei = 0; while( i < a.size() && j < b.size() ) { c = IntToChar( ( CharToNumber(a[i]) + CharToNumber(b[j]) + jinwei ) % 10 ) + c; jinwei = ( CharToNumber(a[i]) + CharToNumber(b[j]) + jinwei ) / 10; j--;i--; } while( j < b.size() ) { c = IntToChar( ( CharToNumber(b[j]) + jinwei ) % 10 ) + c; jinwei = ( jinwei + CharToNumber(b[j]) ) / 10; j--; } while( i < a.size() ) { c = IntToChar( ( CharToNumber(a[i]) + jinwei ) % 10 ) + c; jinwei = ( jinwei + CharToNumber(a[i]) ) / 10; i--; } if( jinwei ) c = IntToChar( jinwei ) + c; return c; } // make char to the int number static int CharToNumber(char c) { if( c >= '0' && c <= '9' ) return int(c - '0'); else { cout<<"exception of input CharToNumber "<<endl; system("pause"); return 0; } } // make int to the model char static char IntToChar(int i) { if( i >= 0 && i <= 9 ) { return char(i+48); } else { cout<<i<<" exception of input IntToChar"<<endl; system("pause"); } } // check whether the string is legal static bool check_all_number(string a) { if(a.empty()) return true ; string::size_type L = a.size(),i = 0; while( i < L ) { if( a[i] < '0' || a[i] > '9') return false; i++; } return true ; } // make a-b mode int a - b; static string Multiplies(string a,string b) { // exception of input if(!check_all_number(a) || !check_all_number(b)) return "exception of input Multiplies"; Standardization(a); Standardization(b); // particular string of input if(a.empty()) { if(b.empty()) return "0"; else return "-"+b; } else if(b.empty()) { return a; } // normal number a < b string c = ""; bool check = true ; if(Compare(a,b) == '=') return "0"; else if(Compare(a,b) == '<') { c = a ; a = b ; b = c ; c = ""; check = false ; } // normal number a >= b string::size_type i = a.size()-1, j = b.size()-1; int jiewei = 0,now; while(i < a.size() && j < b.size()) { now = CharToNumber(a[i]) - CharToNumber(b[j]) - jiewei ; if( now < 0 ) { jiewei = 1; now = 10 + now ; } else jiewei = 0; c = IntToChar(now) + c ; i--;j--; } while(i < a.size()) { now = CharToNumber(a[i]) - jiewei ; if( now < 0 ) { jiewei = 1; now = 10 + now ; } else jiewei = 0; c = IntToChar( now ) + c ; i--; } Standardization(c); if(!check) c = '-' + c; return c; } // compare string a and b static char Compare(string a,string b) { if(a.empty() || b.empty()) { cout<<"error of imput compare"; return 'e'; } else { if(a.size() > b.size()) return '>' ; else if(a.size() == b.size()) { for(string::size_type i = 0;i < a.size(); i++) { if(a[i] > b[i]) return '>'; if(a[i] < b[i]) return '<'; } return '='; } return '<'; } } // make string into standard number static void Standardization(string &a) { if(!check_all_number(a)) { cout<<a<<" exception of input Standardization"<<endl; } string::size_type i = 0; while(i < a.size()) { if(a[i] != '0') break; i++; } a = a.substr(i,a.size()); } }; // main function int main() { string a ; string b ; cin>>a>>b; cout<<"a="<<a<<",b="<<b<<endl; cout<<String::Multiplies(a,b)<<endl; system("pause"); return 0; }
相关文章推荐
- 关于指针的一些事情
- String.intern
- Prototype源码浅析 String部分(二)
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 标准C++类string的Copy-On-Write技术