1!+2!+3!+···+n!

来源:互联网 发布:会计从业资格考试软件 编辑:程序博客网 时间:2024/05/17 21:28

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= 0result= 1n= 1result= 1n= 2result= 3n= 3result= 9n= 4result= 33n= 5result= 153n= 6result= 873n= 7result= 5913n= 8result= 46233n= 9result= 409113n= 10result= 4037913n= 11result= 43954713n= 12result= 522956313n= 13result= 6749977113n= 14result= 93928268313n= 15result= 1401602636313n= 16result= 22324392524313n= 17result= 378011820620313n= 18result= 6780385526348313n= 19result= 128425485935180313n= 20result= 2561327494111820313n= 21result= 53652269665821260313n= 22result= 1177652997443428940313n= 23result= 27029669736328405580313n= 24result= 647478071469567844940313n= 25result= 16158688114800553828940313n= 26result= 419450149241406189412940313n= 27result= 11308319599659758350180940313n= 28result= 316196664211373618851684940313n= 29result= 9157958657951075573395300940313n= 30result= 274410818470142134209703780940313n= 31result= 8497249472648064951935266660940313n= 32result= 271628086406341595119153278820940313n= 33result= 8954945705218228090637347680100940313n= 34result= 304187744744822368938255957323620940313n= 35result= 10637335711130967298604907294846820940313n= 36result= 382630662501032184766604355445682020940313n= 37result= 14146383753727377231082583937026584420940313n= 38result= 537169001220328488991089808037100875620940313n= 39result= 20935051082417771847631371547939998232420940313n= 40result= 836850334330315506193242641144055892504420940313n= 41result= 34289376947494122614363304694584807557656420940313n= 42result= 1439295494700374021157505910939096377494040420940313n= 43result= 61854558558074209658512637979453093884758552420940313n= 44result= 2720126133346522977702138448994068984204397080420940313n= 45result= 122342346998826717539665299944651784048588130840420940313n= 46result= 5624964506810915667389970728744906677010239883800420940313n= 47result= 264248206017979096310354325882356886646207872272920420940313n= 48result= 12678163798554051767172643373255731925167694226950680420940313n= 49result= 620960027832821612639424806694551108812720525606160920420940313n= 50result= 31035053229546199656252032972759319953190362094566672920420940313n= 51result= 1582153806516928479880495049442062531016450082111552784920420940313n= 52result= 82240328977460807051541131905845829506305955522994830608920420940313n= 53result= 4357123613037486371349554885295245479196649743889808555280920420940313n= 54result= 235200820952278866843442297568322826562475214315697749687568920420940313n= 55result= 12931604174610554792808543145134839786142796265765134511963408920420940313n= 56result= 723930191979474006646854190608859789522640775146933593199410448920420940313n= 57result= 41250849696856690762327456096041181924503025571373535738383891728920420940313n= 58result= 2391812180979735262591802366611115865753365343752516460159083805968920420940313n= 59result= 141074930726669571000530822087000522211656242116439949000980378746128920420940313n= 60result= 8462062043468059715276872005310364902965828848477685901450258075155728920420940313n= 61result= 516042275920692858516133684181935592128970357836513689000856197556141328920420940313n= 62result= 31986015536308630384169256039132699680141251155094745881164024445377248528920420940313n= 63result= 2014594330940748694500315964401030837224914941382363373987443624058107002128920420940313n= 64result= 128901526516824912797933705299562511640090431115927555572789337999272811232528920420940313n= 65result= 8376552118599295579521104012085058763826348982461365048494912472388228586208528920420940313n= 66result= 552721491196042359583250344259927811408119413371260239581355039342059309734624528920420940313n= 67result= 37023832409384727647833109440865392238575754727420784833282983539610021746678496528920420940313n= 68result= 2517059374846215327248823528010036973285974956082788457204993721557831467458861792528920420940313n= 69result= 173639511802987526699717162409282876065556519849603157850853034644815111221599509216528920420940313n= 70result= 12152211181772879322772500884098381612524494662396029015406215899272824694011444828896528920420940313n= 71result= 862630799749635196843940145124024391901109102783192264901836979287861505072090462526176528920420940313n= 72result= 62097089176635722058368010530398697132679200887480521248724851943266246492293779736730336528920420940313n= 73result= 4532212550689320062949625148655449807209479901170385537067804944313688350559477096753634016528920420940313n= 74result= 335320756702627961288902653369909231952892731722105356707679731779724924051531042556004506336528920420940313n= 75result= 25144461568098026053235379769963942892879136618292228194503574244435567601624398451999819930336528920420940313n= 76result= 1910639163234148281041167640631110501123273671997621563866991557206279611097162321569729792154336528920420940313n= 77result= 147093731191520017915111951726939395484863652896205980410648566245268270960253582401634937653402336528920420940313n= 78result= 11471374909397817849372633110458985624216613232384457970459611391914103596194454348646721150830746336528920420940313n= 79result= 906089587987695346534516804650290637694024830011956365184327674619752094289696314882008531991840922336528920420940313n= 80result= 72475546634251497641346050527836822803278682172377708942293772732846791349769845157550953399272655002336528920420940313n= 81result= 5869601567381619483521080282105945928215635926904003667688158822449236971043661901413735487649018595482336528920420940313n= 82result= 481233935268665794325659287271510892572028929994897332284849092899193231705942810514420867296128185714842336528920420940313n= 83result= 39936473632475252306223130467392121464008532337638343607509206621268944794702572145394012807399899056621722336528920420940313n= 84result= 3354176608197828519305610709597523409464674818579687830726355239004328076086419436275279735776116652212799642336528920420940313n= 85result= 285064588046252856214253554935658682889521309149153894235828267991564354235882352887315566188117040670487922842336528920420940313n= 86result= 24512159971718985237979776758376918398174391861578535645074592764711726603978332629676780201089436506242148518042336528920420940313n= 87result= 2132269458351246702451580295457766513627958129922934747968047103979365842331571506710360203437504230010976620300442336528920420940313n= 88result= 187614911715749685817248425941004050893848927079322281432389628090868928026359770825810501448242006058427610137151642336528920420940313n= 89result= 16695570072624210767034167688394623360733515163575864136345910335924039962404869510225723072235842668787507993136908442336528920420940313n= 90result= 1502411534554385708076556901309220361246303476448264631078562774040909433056470746056217854443119902314404742463115020442336528920420940313n= 91result= 136702564302394681963243125660804362508833169953354942422820297371194580204616465511741501809193569330065573079231123212442336528920420940313n= 92result= 12575116618943701937438567451534357440086824885828769299263059880309332291188135983954787625646234916683173060061887876876442336528920420940313n= 93result= 1169347623700585276696643729757774793654840054462242304485405341093556139412655451199158077142491080220522169349448965967628442336528920420940313n= 94result= 109905963289374893304061928986544375797841643634645114611982779775138756008830583081428267291725906538781387820551834306498316442336528920420940313n= 95result= 10439884451528434155903764028381271471195587983752017983824233351009432743603533707953193642677150375102063624684778441656913676442336528920420940313n= 96result= 1002117819322478123365475165570275072629379236635019813428200288189501655552695033695642669679677899357177158363650532747296788236442336528920420940313n= 97result= 97194877501804597976693901115133973784973193155807995971532677607523247268034570532501521845268750550618461348043328700394364620556442336528920420940313n= 98result= 9524085326385052343602879644172376447594666957234759659465771454902230317291258369415477681052997870374224311936651789129807012187916442336528920420940313n= 99result= 942786239765826579160595268206839381354754349601050974345395410407078230249590414458830117442618180732911203520208889371641659121356556442336528920420940313请按任意键继续. . .

代码

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 stringclass 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 / 3static string Division(string a,string b);// function 8: make a-b mode int a - b; 4 - 3static string MinusInt(string a,string b);// function 9: mode the add of int :3 + 4static string AddInt(string a,string b);// function 10: make char to the int number :'9' = 9static 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 numberstatic 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%bstatic 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 intstring String::ADD_Int(string a,string b){// exception of inputif( 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 inputif( 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 inputif( 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 resultc = 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/bstring String::DIV_Int(string a,string b){// exception of inputif( 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,ystring String::Pow_Int(string a,string b){// exception of inputif( 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/bstring String::Division(string a,string b){// exception of inputif( 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 < bif(  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 inputif(!Check_all_number(a) || !Check_all_number(b))return "exception of input MinusInt";Standardization(a);Standardization(b);// particular string of inputif(a.empty()){if(b.empty())return "0";elsereturn "-"+b;}else if(b.empty()){return a;}// normal number a < bstring 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 >= bstring::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 intstring String::AddInt(string a,string b){// exception of inputif( 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 numberint 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 charstring 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 bchar 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 numberbool 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 numberstd::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^2string 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 == keystring 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%bstring 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");}}


1 0
原创粉丝点击