过早过度的设计很可能导致意想不到的事倍功半的效果。
先看一个很简单的题目:
水仙花数
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description:
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
输入
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
输出
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
样例输入
100 120
300 380
样例输出
no
370 371
思路不清,过度设计的例子:
#include <iostream>
int main(){
int m,n;
while(std::cin>>m>>n){
int m1 = m%10; //个
int m2 = (m/10)%10; //十
int m3 = m/100; //百
int n1 = n%10;
int n2 = (n/10)%10;
int n3 = n/100;
int a = m3; //1-9 //bai
int b = m2; //0-9 //shi
int c = m1; //0-9 //ge
int num = 0;
int cnt = 0;
for(a = m3; a<=n3; ++a ){
num =(a*a*a);
for(b = m2; (num<=n)&&(b<=9); ++b){
//if(num > n)
// break;
if(a == n3)
{
if(b > n2)
{
break;
}
}
num +=(b*b*b);
for(c = m1;(num<=n)&&(c <= 9); ++c){
//if(num > n)
// break;
if((b == n2)&&(a == n3))
{
if(c > n3)
{
break;
}
}
num+=(c*c*c);
if(num == (a*100+b*10+c)){
if(cnt != 0){
std::cout<<" ";
}
std::cout<<num;
++cnt;
}
num -=(c*c*c);
}
num -=(b*b*b);
}
num = 0;
}
if(cnt == 0)
{
std::cout<<"no";
}
}
return 0;
}
其实答案非常简单:
#include <iostream>
using namespace std;
int main ()
{
int a,b;
while(cin>>a>>b){
int i,j,k,n;
int cnt = 0;
for (n=a;n<=b;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if (n == i*i*i + j*j*j + k*k*k)
{
if(cnt != 0){
std::cout<<" ";
}
cout<<n;
++cnt;
}
}
if(cnt == 0)
{
std::cout<<"no";
}
}
return 0;
}
结论
写代码和做许多事情一样,一开始先不要想着很高的标准和效率。往往是先按照自己的水平写出一个demo来,然后逐步优化。