【心得】切忌過早過分設計【編碼】水仙花數-2016.07.30

過早過分的設計極可能致使意想不到的事倍功半的效果。ios

先看一個很簡單的題目:

水仙花數
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範圍內的水仙花數。

輸入spa

輸入數據有多組,每組佔一行,包括兩個整數m和n(100<=m<=n<=999)。

輸出設計

對於每一個測試實例,要求輸出全部在給定範圍內的水仙花數,就是說,輸出的水仙花數必須大於等於m,而且小於等於n,若是有多個,則要求從小到大排列在一行內輸出,之間用一個空格隔開;
若是給定的範圍內不存在水仙花數,則輸出no;
每一個測試實例的輸出佔一行。

樣例輸入code

100 120
300 380

樣例輸出ip

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來,而後逐步優化。ci

相關文章
相關標籤/搜索