"有道難題2009"複賽題目

突然發現,有道難題也有編程比賽,先看了一下去年的題目,自己寫了一個方法,再與官方給出的方法相比較,下面我對我的方法和官方方法作一下比較,找出不足,進步進步"有道難題2009"複賽題目。首先列出題目:
Problem Statement:

如果一個數字十進制表達時,不存在連續兩位數字相等,則稱之爲“不重複數”。例如,105,1234和12121都是“不重複數”,而11,100和1225不算。給定一個long類型數字A,返回大於A的最小“不重複數”。

Definition:

Class: UnrepeatingNumbers
Method: next
Parameters: long
Returns: long
Method signature: long next(long A)
(be sure your method is public)
 

Constraints:

A 取值範圍是[0, 10^17],注意是閉區間。

Examples:
0) 54
returns: 56
大於54的最小數字是55,但55不是“不重複數”。下一個數字是56,它滿足條件。
1) 10
returns: 12
2) 9 
returns: 10
3) 98
returns: 101
99和100都不是“不重複數”, 101是。
4) 21099 
returns: 21201
 
    這道題目其實不難,可是編程比賽,高手如雲,一道簡單的題目,厲害的人可以寫出效率極高的代碼。。這就是競爭啊。。。所以我們平時編程也不能只求完成,還要求效率。效率效率!
    另外,爲了比較運行時間,在這裏我用了函數clock,以計算程序運行時間。
#include<stdio.h>
#include<time.h>
long next(long n) //我的方法
{
    int i=10;
    long m,a,b;
    n++;
    m=n;
    while(n>9)
    {
        a=n%10;   //低位
        b=n/10%10;//高位
        if(a==b)
        {
            m++;
            n=m;
            i=10;
            continue;
        }
        n/=i;
    }
    return m;
}
long getNext( long A) //官方的方法
{
    A++;
    bool done = true;
    do {
        long d = 1;//每次循環都讓d=1
        while (d*10 < A) //因一開始d=1,若一開始A就比10還小,說明比較到達了最高位,則不執行次循環 
           d*=10;        // 直到A比d大
        
        done = true;
        while (d > 1) {  //只要d是大於1的,說明上面已經執行過循環,也就說明未比較到最高位
            long nd = d / 10;
            if ( (A / d) % 10 == (A / nd) % 10 ) { //高位與低位的比較
                A/= nd;   //用以低位加1
                A++;      //低位加1 
                A*= nd;   //再乘回來
                done = false;
            }
            d = nd;   //表明d和nd都增大10倍
        }
    }
    while (! done);
    return A;
}

int main()
{
    clock_t start,finish;
    double totaltime;
    long a,b;
    scanf("%ld",&a);
    start=clock();//開始計時
    //b=next(a);
    b=getNext(a);
    printf("returns: %ld/n",b);
    finish=clock();  //結束計時
    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
    printf("%lf/n",totaltime);  //打印用時
    return 0;
}
 
    但是,運行結果耗時都是0.000000,這就是clock的侷限性了吧,它只能精確到15ms,而程序運行用的時間更短,或許是這道題比較簡單的緣故吧。不過,在這裏可以學到這個函數的使用方法,方便將來的應用。
   其實,這兩種方法大同小異吧:
相同點
主要是對輸入值進行處理,不斷除10取整,比較,直到比較到最高位爲止;
不同點:
我的方法:另外聲明一個long,對原來的值進行保存,而原來的值,則不斷的進行除10取整;
官方的方法:聲明瞭一個bool變量,用來判斷是否進行到了最高位;而原來的值,則不斷的移位比較而已,通過除10,100,1000...依次比較下去,而bool就用來控制除數的盡頭。
 
 
    總的來說呢,這兩種方法的區別就是,一是改變原值,但要注意對原值的保存;二是改變除數,但要注意對除數界限的控制。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章