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

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");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值