1!+2!+3!+···+n!
个人信息:就读于燕大本科软件工程专业 目前大三;
本人博客:google搜索“cqs_2012”即可;
个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;
博客内容:求1-n的阶乘之和;
博客时间:2014-4-15;
编程语言:C++ ;
编程坏境:Windows 7 专业版 x64;
编程工具:vs2008 32位编译器;
制图工具:office 2010 ppt;
硬件信息:7G-3 笔记本;
引言
成大事者不拘小节,成大事者不漏小节。
题目
求1-n的阶乘之和。
思路
暴力法:时间复杂度O(N^2)
快速法:
思路如下
例如求1-5的阶乘之和
提公因式法,公式变换为 1*(2*(3*(4*(5+1)+1)+1)+1)
时间复杂度O(n)
本博客程序已处理整数溢出,数据可以大的很大
实验
程序结果如下
n= 0 result= 1 n= 1 result= 1 n= 2 result= 3 n= 3 result= 9 n= 4 result= 33 n= 5 result= 153 n= 6 result= 873 n= 7 result= 5913 n= 8 result= 46233 n= 9 result= 409113 n= 10 result= 4037913 n= 11 result= 43954713 n= 12 result= 522956313 n= 13 result= 6749977113 n= 14 result= 93928268313 n= 15 result= 1401602636313 n= 16 result= 22324392524313 n= 17 result= 378011820620313 n= 18 result= 6780385526348313 n= 19 result= 128425485935180313 n= 20 result= 2561327494111820313 n= 21 result= 53652269665821260313 n= 22 result= 1177652997443428940313 n= 23 result= 27029669736328405580313 n= 24 result= 647478071469567844940313 n= 25 result= 16158688114800553828940313 n= 26 result= 419450149241406189412940313 n= 27 result= 11308319599659758350180940313 n= 28 result= 316196664211373618851684940313 n= 29 result= 9157958657951075573395300940313 n= 30 result= 274410818470142134209703780940313 n= 31 result= 8497249472648064951935266660940313 n= 32 result= 271628086406341595119153278820940313 n= 33 result= 8954945705218228090637347680100940313 n= 34 result= 304187744744822368938255957323620940313 n= 35 result= 10637335711130967298604907294846820940313 n= 36 result= 382630662501032184766604355445682020940313 n= 37 result= 14146383753727377231082583937026584420940313 n= 38 result= 537169001220328488991089808037100875620940313 n= 39 result= 20935051082417771847631371547939998232420940313 n= 40 result= 836850334330315506193242641144055892504420940313 n= 41 result= 34289376947494122614363304694584807557656420940313 n= 42 result= 1439295494700374021157505910939096377494040420940313 n= 43 result= 61854558558074209658512637979453093884758552420940313 n= 44 result= 2720126133346522977702138448994068984204397080420940313 n= 45 result= 122342346998826717539665299944651784048588130840420940313 n= 46 result= 5624964506810915667389970728744906677010239883800420940313 n= 47 result= 264248206017979096310354325882356886646207872272920420940313 n= 48 result= 12678163798554051767172643373255731925167694226950680420940313 n= 49 result= 620960027832821612639424806694551108812720525606160920420940313 n= 50 result= 31035053229546199656252032972759319953190362094566672920420940313 n= 51 result= 1582153806516928479880495049442062531016450082111552784920420940313 n= 52 result= 82240328977460807051541131905845829506305955522994830608920420940313 n= 53 result= 4357123613037486371349554885295245479196649743889808555280920420940313 n= 54 result= 235200820952278866843442297568322826562475214315697749687568920420940313 n= 55 result= 129316041746105547928085431451348397861427962657651345119634089204209403 13 n= 56 result= 723930191979474006646854190608859789522640775146933593199410448920420940 313 n= 57 result= 412508496968566907623274560960411819245030255713735357383838917289204209 40313 n= 58 result= 239181218097973526259180236661111586575336534375251646015908380596892042 0940313 n= 59 result= 141074930726669571000530822087000522211656242116439949000980378746128920 420940313 n= 60 result= 846206204346805971527687200531036490296582884847768590145025807515572892 0420940313 n= 61 result= 516042275920692858516133684181935592128970357836513689000856197556141328 920420940313 n= 62 result= 319860155363086303841692560391326996801412511550947458811640244453772485 28920420940313 n= 63 result= 201459433094074869450031596440103083722491494138236337398744362405810700 2128920420940313 n= 64 result= 128901526516824912797933705299562511640090431115927555572789337999272811 232528920420940313 n= 65 result= 837655211859929557952110401208505876382634898246136504849491247238822858 6208528920420940313 n= 66 result= 552721491196042359583250344259927811408119413371260239581355039342059309 734624528920420940313 n= 67 result= 370238324093847276478331094408653922385757547274207848332829835396100217 46678496528920420940313 n= 68 result= 251705937484621532724882352801003697328597495608278845720499372155783146 7458861792528920420940313 n= 69 result= 173639511802987526699717162409282876065556519849603157850853034644815111 221599509216528920420940313 n= 70 result= 121522111817728793227725008840983816125244946623960290154062158992728246 94011444828896528920420940313 n= 71 result= 862630799749635196843940145124024391901109102783192264901836979287861505 072090462526176528920420940313 n= 72 result= 620970891766357220583680105303986971326792008874805212487248519432662464 92293779736730336528920420940313 n= 73 result= 453221255068932006294962514865544980720947990117038553706780494431368835 0559477096753634016528920420940313 n= 74 result= 335320756702627961288902653369909231952892731722105356707679731779724924 051531042556004506336528920420940313 n= 75 result= 251444615680980260532353797699639428928791366182922281945035742444355676 01624398451999819930336528920420940313 n= 76 result= 191063916323414828104116764063111050112327367199762156386699155720627961 1097162321569729792154336528920420940313 n= 77 result= 147093731191520017915111951726939395484863652896205980410648566245268270 960253582401634937653402336528920420940313 n= 78 result= 114713749093978178493726331104589856242166132323844579704596113919141035 96194454348646721150830746336528920420940313 n= 79 result= 906089587987695346534516804650290637694024830011956365184327674619752094 289696314882008531991840922336528920420940313 n= 80 result= 724755466342514976413460505278368228032786821723777089422937727328467913 49769845157550953399272655002336528920420940313 n= 81 result= 586960156738161948352108028210594592821563592690400366768815882244923697 1043661901413735487649018595482336528920420940313 n= 82 result= 481233935268665794325659287271510892572028929994897332284849092899193231 705942810514420867296128185714842336528920420940313 n= 83 result= 399364736324752523062231304673921214640085323376383436075092066212689447 94702572145394012807399899056621722336528920420940313 n= 84 result= 335417660819782851930561070959752340946467481857968783072635523900432807 6086419436275279735776116652212799642336528920420940313 n= 85 result= 285064588046252856214253554935658682889521309149153894235828267991564354 235882352887315566188117040670487922842336528920420940313 n= 86 result= 245121599717189852379797767583769183981743918615785356450745927647117266 03978332629676780201089436506242148518042336528920420940313 n= 87 result= 213226945835124670245158029545776651362795812992293474796804710397936584 2331571506710360203437504230010976620300442336528920420940313 n= 88 result= 187614911715749685817248425941004050893848927079322281432389628090868928 026359770825810501448242006058427610137151642336528920420940313 n= 89 result= 166955700726242107670341676883946233607335151635758641363459103359240399 62404869510225723072235842668787507993136908442336528920420940313 n= 90 result= 150241153455438570807655690130922036124630347644826463107856277404090943 3056470746056217854443119902314404742463115020442336528920420940313 n= 91 result= 136702564302394681963243125660804362508833169953354942422820297371194580 204616465511741501809193569330065573079231123212442336528920420940313 n= 92 result= 125751166189437019374385674515343574400868248858287692992630598803093322 91188135983954787625646234916683173060061887876876442336528920420940313 n= 93 result= 116934762370058527669664372975777479365484005446224230448540534109355613 9412655451199158077142491080220522169349448965967628442336528920420940313 n= 94 result= 109905963289374893304061928986544375797841643634645114611982779775138756 008830583081428267291725906538781387820551834306498316442336528920420940313 n= 95 result= 104398844515284341559037640283812714711955879837520179838242333510094327 43603533707953193642677150375102063624684778441656913676442336528920420940313 n= 96 result= 100211781932247812336547516557027507262937923663501981342820028818950165 5552695033695642669679677899357177158363650532747296788236442336528920420940313 n= 97 result= 971948775018045979766939011151339737849731931558079959715326776075232472 68034570532501521845268750550618461348043328700394364620556442336528920420940313 n= 98 result= 952408532638505234360287964417237644759466695723475965946577145490223031 72912583694154776810529978703742243119366517891298070121879164423365289204209403 13 n= 99 result= 942786239765826579160595268206839381354754349601050974345395410407078230 24959041445883011744261818073291120352020888937164165912135655644233652892042094 0313 请按任意键继续. . .
代码
test.cpp
#include<iostream> #include "mine_string.h" using namespace std; // function: _N_factorial_sum // input: a number n within string // output: the sum within string // 功能: 实现1!- n!的和 string _N_factorial_sum(string n); int main( ) { string n="0"; while(String::Compare(n,"100")=='<') { cout<<"n= "<<n<<endl; cout<<"result= "<<_N_factorial_sum(n)<<endl; n = String::ADD_Int(n,"1"); } system("pause"); return 0; } // function: _N_factorial_sum // input: a number n within string // output: the sum within string // 功能: 实现1!- n!的和 // O(t): O(n) string _N_factorial_sum(string n) { if(String::Compare(n,"0") == '=') { return "1"; } else if(String::Compare(n,"0") == '>') { string result = n; while(String::Compare(n,"1") == '>') { n = String::MINUS_Int(n,"1"); result = String::MULT_Int( n , String::ADD_Int(result,"1") ); } return result; } else return "error of function _N_factorial_sum input"; }
mine_string.h#include <iostream> #include <string> #include <limits> using namespace std; // extra the class of string class String:public string { public: // function 1: mode the add of int( (-3) + (-3) ) = - 6 // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符串,字符串里面是整数; // 功能: 实现参数两个整数的相加操作,结果存在返回的字符串里 static string ADD_Int(string a,string b); // function 2: make a-b mode int a - b; 7 - (-3) = 10 // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符串,字符串里面是整数; // 功能: 实现参数两个整数的相减操作,结果存在返回的字符串里 static string MINUS_Int(string a,string b); // function 3: make a*b mode int a * b; // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符串,字符串里面是整数; // 功能: 实现参数两个整数的相乘操作,结果存在返回的字符串里 static string MULT_Int(string a,string b); // function 4: mode the division a/b // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符串,字符串里面是整数; // 功能: 实现参数两个整数的相除操作,结果存在返回的字符串里 static string DIV_Int(string a,string b); // function 5: pow number a^b // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符串,字符串里面是整数; // 功能: 实现参数两个整数的a^b操作,结果存在返回的字符串里 static string Pow_Int(string a,string b); // function 6: int To string :"123" = 123 // input: 一个int数 a; // output: 返回一个字符串,字符串里面是整数; // 功能: 将整数a转换成对应的字符串格式 static string Int_To_String(int x); // function 7: static char division a/b : 4 / 3 static string Division(string a,string b); // function 8: make a-b mode int a - b; 4 - 3 static string MinusInt(string a,string b); // function 9: mode the add of int :3 + 4 static string AddInt(string a,string b); // function 10: make char to the int number :'9' = 9 static int CharToNumber(char c); // function 11: make int to the model char : 7 = '7' static string IntToChar(int i); // function 12: check whether the string is legal static bool Check_all_number(string a); // function 13: compare string a and b // input: 两个字符串 a 和 b,里面放的都是整数; // output: 返回一个字符,字符里是a和b的大小关系; // 功能: 实现参数两个整数的a和b比较操作,结果< or = or >存在返回的字符里 static char Compare(string a,string b); // function 14: make string into standard string number static bool Standardization(string &a); // function 15: make string(>0) into standard int number // input: 一个字符串 a,里面放的是一个整数; // output: 返回一个字符串,字符串里是a对应的整形数据; // 功能: 将存在字符串里的整数取出来,放在整形容器里,然后返回,根据返回的结果可以判定是否转换成功 static std::pair<bool,int> String_into_intNumber(string &a); // function 16: get data // input: a int number data with string // output: a string number b // 功能: 实现 sqrt 函数 static string Sqrt_data( string data ,int weishu); // function 17: go larger // input: a int keyword with string , and the int keyword key // output: a double number // 功能: 尝试找到一个区间使得 a^2 <= key <= b^2 static string _make_qujian(string key,int weishu); // function 18: binary search // input: two int numbers s and b, and the int keyword key and weishu // output: a double number with string // 功能: 实现sqrt函数,找到 r^2 == key static string _binary_search(string s,string b,string key,int weishu); // function 19: get perfect double // input: two strings with data and key ,weishu // output: a string with result(data < result < data+1) ,and result^2 <= key // 功能: 实现整数开方精确到小数部分 static string _get_perfect(string data,string key,int weishu); // function 19: get more number // input: two string data and key ,(bigger) // output: a pair with <bool,string>,if(true) perfect string,or bad string // 功能: 进一步精确小数的位数 static std::pair<bool,string> _get_more_number(string data,string key); // function 20: 求余操作 // input: two int number within string // output: a int number within string // 功能: 求出a%b static string Qiuyu(string a,string b); // function 21: Qiu fanshu // input: a int number within string // output: a int number within string // 功能: 实现取反操作 static string Qiu_fanshu(string a); // function 22: data to binary system // input: a int number within string // output: a fuhao wei within bool and a binary_system result with string // 功能 : 把一个十进制数转换成二进制数 static std::pair<bool,string> Data_to_Binary_system(string data); }; // mode the add of int string String::ADD_Int(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_Int"; } Standardization(a); Standardization(b); if(a[0] != '-' && b[0] != '-') return AddInt(a,b); else if(a[0] != '-'&& b[0] == '-') return MinusInt( a,b.substr( 1,b.size() ) ); else if(a[0] == '-'&& b[0] != '-') return MinusInt(b,a.substr(1,a.size())); else return '-'+AddInt(a.substr(1,a.size()),b.substr( 1,b.size() )); }; // make a-b mode int a - b; string String::MINUS_Int(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 Multiplies_Int"; } Standardization(a); Standardization(b); if(a[0] != '-' && b[0] != '-') return MinusInt(a,b); else if(a[0] != '-' && b[0] == '-') return AddInt(a,b.substr(1,b.size())); else if(a[0] == '-' && b[0] != '-') return "-"+AddInt(a.substr(1,a.size()),b); else return MinusInt( b.substr(1,b.size()) , a.substr(1,a.size()) ); }; // make a*b mode int a * b; string String::MULT_Int(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 Multiplies_Int"; } Standardization(a); Standardization(b); string::size_type i = a.size(),j = b.size(); string c = "0",d = ""; bool fushu = (a[0] == '-' && b[0] != '-')||(a[0] != '-' && b[0] == '-'); if(a[0] == '-') a = a.substr(1,a.size()); if(b[0] == '-') b = b.substr(1,b.size()); int jinwei = 0; for( j = b.size()-1 ; j < b.size() ;j--) { // each number of b to * a jinwei = 0; for( i = a.size()-1 ; i < a.size() ;i-- ) { d = IntToChar( ( CharToNumber(a[i]) * CharToNumber(b[j]) + jinwei ) % 10 )+ d ; jinwei = ( CharToNumber(a[i]) * CharToNumber(b[j]) + jinwei ) / 10 ; } if(jinwei) d = IntToChar(jinwei) +d; // add all number result c = ADD_Int(c,d); d = ""; unsigned int zero = 0 ; while( zero < b.size() - j ) { d = d + '0'; zero ++; } } Standardization(c); if( fushu && c != "0" ) return '-'+c; else return c; }; // mode the division a/b string String::DIV_Int(string a,string b) { // exception of input if( a.empty() ) return "0"; else if( b.empty() ) return "e"; if(!Check_all_number(a) || !Check_all_number(b)) { return "exception of input DIV_Int"; } Standardization(a); Standardization(b); if(b == "0") return "e"; bool fushu = (a[0] == '-' && b[0] != '-')||(a[0] != '-' && b[0] == '-'); if( a[0] == '-' ) a = a.substr(1,a.size()); if( b[0] == '-' ) b = b.substr(1,b.size()); if( Compare(a,b) == '<' ) return "0"; string yushu = ""; string beichushu = a.substr(0,b.size()); string shang = Division( beichushu , b); yushu = MinusInt( beichushu ,MULT_Int( shang, b) ); string c = shang; for(string::size_type i = b.size(); i<a.size(); i++) { beichushu = yushu+ a[i] ; shang = Division( beichushu , b); c = c + shang; yushu = MinusInt( beichushu ,MULT_Int( shang, b) ); } Standardization(c); return fushu?('-'+c):c; }; // function: pow number x,y string String::Pow_Int(string a,string b) { // exception of input if( a.empty() ) return "0"; else if( b.empty() ) return "e"; if(!Check_all_number(a) || !Check_all_number(b)) { return "exception of input DIV_Int"; } Standardization(a); Standardization(b); string result = "1" ; if(Compare(b,"0") != '<') for(string i ="0" ;Compare(i,b) == '<' ;i = AddInt(i,"1")) { result = MULT_Int(result,a); } else for(string i ="0" ;Compare(i,b) == '>' ;i = MINUS_Int(i,"1")) { result = DIV_Int(result,a); } return result ; }; // function : int To string string String::Int_To_String(int x) { bool fushu = false; string result=""; if(x < 0 ) { fushu = true ; x = -x; } else if( x == 0 ) return "0"; while(x) { result = IntToChar(x % 10) + result; x = x/10; } if(fushu) result = "-"+result; return result; }; // static char division a/b string String::Division(string a,string b) { // exception of input if( a.empty() ) return "0"; else if( b.empty() ) return "e"; if(!Check_all_number(a) || !Check_all_number(b)) { cout<<"exception of input Division"<<endl; return "e"; } Standardization(a); Standardization(b); int i = 0; while( i<=9 ) { // if a - b*i < b if( Compare( MINUS_Int( a , MULT_Int(IntToChar(i),b) ) , b ) == '<' ) break; i++; } if( i>9 ) return "e"; return ""+IntToChar(i); }; // make a-b mode int a - b; string String::MinusInt(string a,string b) { // exception of input if(!Check_all_number(a) || !Check_all_number(b)) return "exception of input MinusInt"; 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; }; // mode the add of int string String::AddInt(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 AddInt"; } 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; Standardization(c); return c; }; // make char to the int number int String::CharToNumber(char c) { if( c >= '0' && c <= '9' ) return int(c - '0'); else { cout<<c<<" exception of input CharToNumber "<<endl; system("pause"); return 0; } }; // make int to the model char string String::IntToChar(int i) { if( i >= 0 && i <= 9 ) { string c = ""; return c+char(i+48); } else { cout<<i<<" exception of input IntToChar"<<endl; system("pause"); return "e"; } }; // check whether the string is legal bool String::Check_all_number(string a) { if(a.empty()) return true ; string::size_type L = a.size(),i = 0; if(a[0] == '-') i++; while( i < L ) { if( a[i] < '0' || a[i] > '9') return false; i++; } return true ; }; // compare string a and b char String::Compare(string a,string b) { if(a.empty() || b.empty()) { cout<<"error of input compare"; return 'e'; } else { if(!Check_all_number(a) || !Check_all_number(b)) { return 'e'; } Standardization(a); Standardization(b); if(a[0] == '-' && b[0] != '-') return '<'; else if( a[0] != '-' && b[0] == '-') return '>'; bool fushu = (a[0] == '-'); if(a.size() > b.size() ) return fushu?'<':'>'; else if(a.size() == b.size()) { for(string::size_type i = 0;i < a.size(); i++) { if(a[i] > b[i]) return fushu?'<':'>'; if(a[i] < b[i]) return fushu?'>':'<'; } return '='; } return fushu?'>':'<'; } }; // make string into standard string number bool String::Standardization(string &a) { if(!Check_all_number(a)) { cout<<a<<" exception of input Standardization"<<endl; return false; } string::size_type i = 0 ; bool fushu = false ; if( a[0] == '-' ) { fushu = true ; i = 1 ; } while(i < a.size()) { if(a[i] != '0') break; i++; } if(i == a.size()) i--; a = a.substr(i,a.size()) ; if( fushu && a != "0") a = '-' + a ; return true ; }; // make string(>0) into standard int number std::pair<bool,int> String::String_into_intNumber(string &a) { if(Standardization(a)) { int max_int = numeric_limits<int>::max()-1 ; string max = Int_To_String(max_int); bool fushu = false; if(a[0] == '-') { fushu = true ; a = a.substr(1,a.length()); } if(Compare(a,max) != '<') { cout<<"溢出 exception"<<endl; return std::make_pair(false,0); } int result = 0 ; for(size_t i =0;i<a.length();i++) { result = result * 10 + CharToNumber(a[i]); } if(fushu) result = - result; return std::make_pair(true,result); } else { cout<<"exception of function String_into_intNumber input"<<endl; return std::make_pair(false,0); } }; // function: get data // input: a int number data with string // output: a double number b with string // 功能: 实现 sqrt 函数 string String::Sqrt_data( string data ,int weishu) { if(weishu < 0) weishu = 0; if(! String::Check_all_number(data)) { cout<<"exception of function _sqrt_data input"<<endl; return "NULL"; } String::Standardization(data); char r = String::Compare(data,"0"); if(r == '=') return "0"; else if(r == '<') { cout<<"exception of function _sqrt_data input"<<endl; } return _make_qujian(data,weishu); } // function: go larger // input: two int number a and b, and the int keyword key // output: a double number with string // 功能: 尝试找到一个区间使得 a^2 <= key <= b^2 string String::_make_qujian(string key,int weishu) { if( String::Compare(key,"0") == '>' && weishu >=0 ) { string s,b; int length = key.length()/2; // 偶数 if(key.length() % 2 == 0) { s = String::Pow_Int("10",String::Int_To_String(length-1)); b = String::Pow_Int("10",String::Int_To_String(length)); } // 奇数 else { s = String::Pow_Int("10",String::Int_To_String(length)); b = String::Pow_Int("10",String::Int_To_String(length+1)); } return _binary_search(s,b,key,weishu);// binary search } else { cout<<"exception of function _go_larger input"<<endl; return "NULL"; } } // function: binary search // input: two int numbers s and b, and the int keyword key // output: a double number with string // 功能: 实现sqrt函数,找到 r^2 == key string String::_binary_search(string s,string b,string key,int weishu) { if( String::Compare(s,"1")!= '<' && String::Compare(b,s) != '<' && weishu >= 0 ) { string s_2 = String::MULT_Int(s,s); string b_2 = String::MULT_Int(b,b); if(String::Compare(key,s_2) == '=') return s; if(String::Compare(key,b_2) == '=') return b; string zhong ,zhong_2,zhong2_2; char r ; while(String::Compare(s,b) != '>') { zhong = String::DIV_Int(String::ADD_Int(s,b) ,"2"); //zhong = s + (b-s)/2; zhong_2 = String::MULT_Int(zhong,zhong); r = String::Compare(zhong_2,key); if(r == '>') b = String::MINUS_Int(zhong,"1"); else if( r == '=' ) return zhong; else if(r == '<') { zhong2_2 = String::MULT_Int(String::ADD_Int(zhong,"1"),String::ADD_Int(zhong,"1")); r = String::Compare(zhong2_2,key); if(r == '>') return _get_perfect(zhong,key,weishu); else s = String::ADD_Int(zhong,"1"); } } } else { cout<<"exception of function _binary_search input"<<endl; } } // function: get perfect double // input: two strings with data and key // output: a string with result(data < result < data+1) ,and result^2 <= key // 功能: 实现整数开方精确到小数部分 string String::_get_perfect(string data,string key,int weishu) { int i = weishu; string d = data; string k = key; string result; std::pair<bool,string> r ; while(i > 0) { r = _get_more_number(d,k); if(r.first == true) break; else { d = r.second; k += "00"; } i--; } if(weishu != 0) result = data+"."+d.substr(data.length(),d.length()-data.length()); else result = data; return result; } // function: get more number // input: two string data and key ,(bigger) // output: a pair with <bool,string>,if(true) perfect string,or bad string // 功能: 进一步精确小数的位数 std::pair<bool,string> String::_get_more_number(string data,string key) { char s = '1',e ='9',zhong,guanxi1,guanxi2 ; key += "00" ; string r1,r2 ; r1 = String::MULT_Int((data+'9'),(data+'9')) ; guanxi1 = String::Compare(r1,key) ; if(guanxi1 == '<') return std::make_pair(false,data+'9'); else if(guanxi1 == '=') return std::make_pair(true,data+'9'); r1 = String::MULT_Int((data+'1'),(data+'1')); guanxi1 = String::Compare(r1,key); if(guanxi1 == '=') return std::make_pair(true,data+'1'); else if(guanxi1 == '>') return std::make_pair(false,data+'0'); while(s <= e) { zhong = (s+e)/2; r1 = String::MULT_Int((data+zhong),(data+zhong)); guanxi1 = String::Compare(r1,key); if(guanxi1 == '=') { return std::make_pair(true,data+zhong); } else if(guanxi1 == '>') e = zhong -1; else if(guanxi1 == '<') { r2 = String::MULT_Int((data+char(zhong+1)),(data+char(zhong+1))); guanxi2 = String::Compare(r2,key); if(guanxi2 == '>') return std::make_pair(false,data+zhong); else s = zhong+1; } } } // function: 求余操作 // input: two int number within string // output: a int number within string // 功能: 求出a%b string String::Qiuyu(string a,string b) { if(String::Compare(a,"0") != '>' || String::Compare(b,"0") != '>') return "error of function Qiuyu input"; string shang = String::DIV_Int(a,b); string chengji = String::MULT_Int(shang,b); return String::MINUS_Int(a,chengji); } // function: Qiu fanshu // input: a int number within string // output: a int number within string // 功能: 实现取反操作 string String::Qiu_fanshu(string a) { if(String::Check_all_number(a)) { String::Standardization(a); if(a[0] == '-') return a.substr(1,a.length()-1); else return ("-"+a) ; } else { cout<<"exception of function Qiu_fanshu input"<<endl; return "error"; } } // function: data to binary system // input: a int number within string // output: a fuhao wei within bool and a binary_system result with string // 功能 : 把一个十进制整数转换成二进制数 std::pair<bool,string> String::Data_to_Binary_system(string data) { if(String::Check_all_number(data)) { String::Standardization(data); string result = ""; if(String::Compare(data,"0") == '=') return std::make_pair(false,"0"); bool fushu = false; if(String::Compare(data,"0") == '<') { data = String::Qiu_fanshu(data); fushu = true; } while(String::Compare(data,"0") == '>') { result = String::Qiuyu(data,"2") + result ; data = String::DIV_Int(data,"2"); } return std::make_pair(fushu,result); } else { cout<<"exception of function Data_to_Binary_system input"<<endl; return make_pair(true,"error"); } }