【心得】切忌过早过度设计【编码】水仙花数-2016.07.30

浏览: 158 发布日期: 2016-08-18 分类: visual-studio

过早过度的设计很可能导致意想不到的事倍功半的效果。

先看一个很简单的题目:

水仙花数
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来,然后逐步优化。

返回顶部