题目背景:
历次修改代码:
#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只做一次赋值,效率大大改进了。