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只做一次赋值,效率大大改进了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值