ACM--Children’s Queue

題目背景:


歷次修改代碼:

#include<iostream>
#include<string>
using namespace std;

string getCnt(int);
string sumString(string, string);
char intTochar(int);
int charToint(char);

int main()
{
	int m;
	
	while(cin>>m)
	{
		cout<<getCnt(m)<<endl;
	}
	return 0;
}

string getCnt(int n)
{
	if(n == 1)
	{
		return "1";
	}
	if(n == 2)
	{
		return "2";
	}
	if(n == 3)
	{
		return "4";
	}
	if(n == 4)
	{
		return "7";
	}
	string f1 = "1";
	string f2 = "2";
	string f3 = "4";
	string f4 = "7";
	string sum;
	
 	for(int i=4; i<n; i++)
	{
		sum = sumString(f4, f3);
		sum = sumString(sum, f1); 
		f1 = f2;
		f2 = f3;
		f3 = f4;
		f4 = sum;
	}
	return sum;
}

string sumString(string f1, string f2)
{
	int len1 = f1.length();
	int len2 = f2.length();
	int minLen = (len1>len2)?len2:len1;
	
	if(len2>len1)
	{
		string str;
		str = f2;
		f2 = f1;
		f1 = str;
	}//把f1處理爲更長的那一個,最後返回的就是f1 

	int lastInteger;
	int jinwei = 0;
	int val;
	for(int i=0; i<minLen; i++)
	{
		val = charToint(f1[len1 - i -1]) + charToint(f2[len2 - i -1]) + jinwei;
		jinwei = 0;
		if(val > 9)
		{
			jinwei = 1;
			val = val % 10;
		}
		f1[len1 - i -1] = intTochar(val);
	}
	if(jinwei != 0)
	{
		for(int i=minLen; i<f1.length(); i++)
		{
			val = charToint(f1[len1 - i -1]) + jinwei;
			jinwei = 0;
			if(val > 9)
			{
				jinwei = 1;
				val = val % 10;
			}
			f1[len1 - i -1] = intTochar(val);
		}
	}
	if(jinwei != 0)
	{
		f1 = "1" + f1;
	}
	return f1; 
}

int charToint(char c)
{
	return (int)c - 48;
}

char intTochar(int n)
{
	return (char)(n + 48);
}
對不起,runtimee rror

#include<iostream>
#include<string>
using namespace std;

string getCnt(int);
string sumString(string, string, string);
char intTochar(int);
int charToint(char);

int main()
{
	int m;
	
	while(cin>>m)
	{
		cout<<getCnt(m)<<endl;
	}
	return 0;
}

string getCnt(int n)
{
	if(n == 1)
	{
		return "1";
	}
	if(n == 2)
	{
		return "2";
	}
	if(n == 3)
	{
		return "4";
	}
	if(n == 4)
	{
		return "7";
	}
	string f1 = "1";
	string f2 = "2";
	string f3 = "4";
	string f4 = "7";
	string sum;
	
 	for(int i=4; i<n; i++)
	{
		sum = sumString(f4, f3, f1);
		f1 = f2;
		f2 = f3;
		f3 = f4;
		f4 = sum;
	}
	return sum;
}

int max(int a, int b, int c)
{
	if(a>=b)
	{
		return (a>c)?a:c;
	}
	else
	{
		return (b>c)?b:c;
	}
}

string sumString(string f1, string f2, string f3)
{
	int len1 = f1.length();
	int len2 = f2.length();
	int len3 = f3.length();
	int maxLen = max(len1, len2, len3);
	
	string str;	
	if(len2 == maxLen)
	{
		str = f2;
		f2 = f1;
		f1 = str;		
	}	
	if(len3 == maxLen)
	{
		str = f3;
		f3 = f1;
		f1 = str;
	}//把f1處理爲更長的那一個,最後返回的就是f1 
	len1 = f1.length();
	len2 = f2.length();
	len3 = f3.length();
	
	int lastInteger;
	int jinwei = 0;
	int val = 0;
	for(int i=0; i<maxLen; i++)
	{
//		val = charToint(f1[len1 - i -1]) + charToint(f2[len2 - i -1]) + charToint(f3[len3 - i -1]) + jinwei;
		if(len1-i-1>=0)
		{
			val = (int)(f1[len1 - i -1]-48);
		}
		if(len2-i-1>=0)
		{
			val = val + (int)(f2[len2 - i -1] - 48);
		}
		if(len3-i-1>=0)
		{
			val = val + (int)(f3[len3 - i -1] - 48);
		}
		val += jinwei;
		
		jinwei = 0;
		if(val > 9)
		{
			jinwei = val/10;
			val = val % 10;
		}
		f1[len1 - i -1] = (char)(val + 48);
	}
	
	if(jinwei == 1)
	{
		f1 = "1" + f1;
	}
	else if(jinwei == 2)
	{
		f1 = "2" + f1;
	}
	return f1; 
}

int charToint(char c)
{
	return (int)c - 48;
}

char intTochar(int n)
{
	return (char)(n + 48);
}
改進之處,將兩次加法改爲一次加法,即三個string一次做加法完成,結果還是runtime error,實際上,這個效率一定是改進了的,可是還沒有改進到點上。

#include<iostream>
#include<string>
using namespace std;

string getCnt(int);
string sumString(string, string, string);
char intTochar(int);
int charToint(char);
string strArray[1001];

int main()
{
	int m;
	for(int i=1; i<1001; i++)
	{
		strArray[i] = getCnt(i);
	}
	while(cin>>m)
	{
		cout<<strArray[m]<<endl;
	}
	return 0;
}

string getCnt(int n)
{
	if(n == 1)
	{
		return "1";
	}
	if(n == 2)
	{
		return "2";
	}
	if(n == 3)
	{
		return "4";
	}
	if(n == 4)
	{
		return "7";
	}
	string f1 = "1";
	string f2 = "2";
	string f3 = "4";
	string f4 = "7";
	string sum;
	
 	for(int i=4; i<n; i++)
	{
		sum = sumString(f4, f3, f1);//這裏依然在調用,會造成多次計算 
		f1 = f2;
		f2 = f3;
		f3 = f4;
		f4 = sum;
	}
	return sum;
}

int max(int a, int b, int c)
{
	if(a>=b)
	{
		return (a>c)?a:c;
	}
	else
	{
		return (b>c)?b:c;
	}
}

string sumString(string f1, string f2, string f3)
{
	int len1 = f1.length();
	int len2 = f2.length();
	int len3 = f3.length();
	int maxLen = max(len1, len2, len3);
	
	string str;	
	if(len2 == maxLen)
	{
		str = f2;
		f2 = f1;
		f1 = str;		
	}	
	if(len3 == maxLen)
	{
		str = f3;
		f3 = f1;
		f1 = str;
	}//把f1處理爲更長的那一個,最後返回的就是f1 
	len1 = f1.length();
	len2 = f2.length();
	len3 = f3.length();
	
	int lastInteger;
	int jinwei = 0;
	int val = 0;
	for(int i=0; i<maxLen; i++)
	{
//		val = charToint(f1[len1 - i -1]) + charToint(f2[len2 - i -1]) + charToint(f3[len3 - i -1]) + jinwei;
		if(len1-i-1>=0)
		{
			val = (int)(f1[len1 - i -1]-48);
		}
		if(len2-i-1>=0)
		{
			val = val + (int)(f2[len2 - i -1] - 48);
		}
		if(len3-i-1>=0)
		{
			val = val + (int)(f3[len3 - i -1] - 48);
		}
		val += jinwei;
		
		jinwei = 0;
		if(val > 9)
		{
			jinwei = val/10;
			val = val % 10;
		}
		f1[len1 - i -1] = (char)(val + 48);
	}
	
	if(jinwei == 1)
	{
		f1 = "1" + f1;
	}
	else if(jinwei == 2)
	{
		f1 = "2" + f1;
	}
	return f1; 
}

int charToint(char c)
{
	return (int)c - 48;
}

char intTochar(int n)
{
	return (char)(n + 48);
}
改進方式:在main裏面將結果存在數組裏面,直接根據輸入的索引,到數組裏面取結果即可,仔細思考一下,這其實就是上一版程序,執行了1001次而已,實際上根本沒有改進,要做改進,必須在函數裏面改進,在引用函數的地方做的改進都是假的。

#include<iostream>
#include<string>
using namespace std;

string getCnt(int);
string sumString(string, string, string);
char intTochar(int);
int charToint(char);
string strArray[1001];

int main()
{
	int m;
	for(int i=1; i<1001; i++)
	{
		strArray[i] = getCnt(i);
	}
	while(cin>>m)
	{
		cout<<strArray[m]<<endl;
	}
	return 0;
}

string getCnt(int n)
{
	if(n == 1)
	{
		return "1";
	}
	if(n == 2)
	{
		return "2";
	}
	if(n == 3)
	{
		return "4";
	}
	if(n == 4)
	{
		return "7";
	}
	string f1 = "1";
	string f2 = "2";
	string f3 = "4";
	string f4 = "7";
	
	strArray[1] = "1";
	strArray[2] = "2";
	strArray[3] = "4";
	strArray[4] = "7"; 
	string sum;
	
 	for(int i=4; i<n; i++)
	{
		sum = sumString(strArray[i], strArray[i-1], strArray[i-3]);//這裏依然在調用,會造成多次計算 
//		strArray[1] = strArray[2];
		
//		f1 = f2;
//		f2 = f3;
//		f3 = f4;
//		f4 = sum;
	}
	return sum;
}

int max(int a, int b, int c)
{
	if(a>=b)
	{
		return (a>c)?a:c;
	}
	else
	{
		return (b>c)?b:c;
	}
}

string sumString(string f1, string f2, string f3)
{
	int len1 = f1.length();
	int len2 = f2.length();
	int len3 = f3.length();
	int maxLen = max(len1, len2, len3);
	
	string str;	
	if(len2 == maxLen)
	{
		str = f2;
		f2 = f1;
		f1 = str;		
	}	
	if(len3 == maxLen)
	{
		str = f3;
		f3 = f1;
		f1 = str;
	}//把f1處理爲更長的那一個,最後返回的就是f1 
	len1 = f1.length();
	len2 = f2.length();
	len3 = f3.length();
	
	int lastInteger;
	int jinwei = 0;
	int val = 0;
	for(int i=0; i<maxLen; i++)
	{
		if(len1-i-1>=0)
		{
			val = (int)(f1[len1 - i -1]-48);
		}
		if(len2-i-1>=0)
		{
			val = val + (int)(f2[len2 - i -1] - 48);
		}
		if(len3-i-1>=0)
		{
			val = val + (int)(f3[len3 - i -1] - 48);
		}
		val += jinwei;
		
		jinwei = 0;
		if(val > 9)
		{
			jinwei = val/10;
			val = val % 10;
		}
		f1[len1 - i -1] = (char)(val + 48);
	}
	
	if(jinwei == 1)
	{
		f1 = "1" + f1;
	}
	else if(jinwei == 2)
	{
		f1 = "2" + f1;
	}
	return f1; 
}

int charToint(char c)
{
	return (int)c - 48;
}

char intTochar(int n)
{
	return (char)(n + 48);
}
在getcnt(string)裏面做了改進,將strArray作爲了過程變量,而廢棄了f1,f2這樣的中間變量,這裏的變動和上一版類似,main裏面每for一次,便對strArray進行了一次賦值,無實際意義。

/**
這幾個版本的問題綜述:
較之上一個版本,main函數有了很大的改變,只執行了一次getResultArray();而且結果保存在string數組裏面,根據輸入下標索引取就可以啦!
上一個版本的問題在於,實際上strArray之前的過程量還是沒有用上了,main裏面每算一次for,調用getString(),這就造成過程量還是沒有真正
用上 
*/
#include<iostream>
#include<string>
using namespace std;

void getResultArray();
string sumString(string, string, string);
char intTochar(int);
int charToint(char);
string strArray[1001];

int main()
{
	int m;
	
	getResultArray();
	while(cin>>m)
	{
		cout<<strArray[m]<<endl;
	}
	return 0;
}

void getResultArray()
{
	string f1 = "1";
	string f2 = "2";
	string f3 = "4";
	string f4 = "7";
	
	strArray[1] = "1";
	strArray[2] = "2";
	strArray[3] = "4";
	strArray[4] = "7"; 
	
 	for(int i=5; i<1001; i++)
	{
		strArray[i] = sumString(strArray[i-1], strArray[i-2], strArray[i-4]);//這裏依然在調用,會造成多次計算 
	}
}

int max(int a, int b, int c)
{
	if(a>=b)
	{
		return (a>c)?a:c;
	}
	else
	{
		return (b>c)?b:c;
	}
}

string sumString(string f1, string f2, string f3)
{
	int len1 = f1.length();
	int len2 = f2.length();
	int len3 = f3.length();
	int maxLen = max(len1, len2, len3);
	
	string str;	
	if(len2 == maxLen)
	{
		str = f2;
		f2 = f1;
		f1 = str;		
	}	
	if(len3 == maxLen)
	{
		str = f3;
		f3 = f1;
		f1 = str;
	}//把f1處理爲更長的那一個,最後返回的就是f1 
	len1 = f1.length();
	len2 = f2.length();
	len3 = f3.length();
	
	int lastInteger;
	int jinwei = 0;
	int val = 0;
	for(int i=0; i<maxLen; i++)
	{
		if(len1-i-1>=0)
		{
			val = (int)(f1[len1 - i -1]-48);
		}
		if(len2-i-1>=0)
		{
			val = val + (int)(f2[len2 - i -1] - 48);
		}
		if(len3-i-1>=0)
		{
			val = val + (int)(f3[len3 - i -1] - 48);
		}
		val += jinwei;
		
		jinwei = 0;
		if(val > 9)
		{
			jinwei = val/10;
			val = val % 10;
		}
		f1[len1 - i -1] = (char)(val + 48);
	}
	
	if(jinwei == 1)
	{
		f1 = "1" + f1;
	}
	else if(jinwei == 2)
	{
		f1 = "2" + f1;
	}
	return f1; 
}

int charToint(char c)
{
	return (int)c - 48;
}

char intTochar(int n)
{
	return (char)(n + 48);
}
對整個結構進行變動,main函數裏面只執行一次getcnt(這裏改成了getResultArray函數),就是對strArray只做一次賦值,效率大大改進了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章