題目連結: Uva455

解題想法

輸入

第一行是1個整數n,代表有幾組測資。接下來每組測資都包含兩行,分別是空白行以及一個字串(最多80個字元)。

Solve

題目要我們找出字串的最小週期

一個字串最小週期的最大可能值是字串本身的長度,所以用for迴圈,假設i為可能最小週期,從i=1開始檢查到i=字串長度。

由於最小週期一定要是字串長度的因數,也就是最小週期一定要能整除字串的長度。所以進到第一個for迴圈內後,用一個if檢查前面的陳述(假設的最小週期是否整除字串長度)是否為真。

接下來是我在寫的時候想比較久的地方,用第二個for迴圈從字串的第一個字元檢查到最後一個字元,搭配if檢查該字串的最小週期是否如同我們假設的i。這個迴圈從頭檢查到尾,裡面的if檢查字元是否等於字元Mod最小週期

字元是否等於字元Mod最小週期

字串word: abcdabcd

a b c d a b c d

0 1 2 3 4 5 6 7

假設最小週期=2

word[0] == word[0%2]

word[1] == word[1%2]

word[2] != word[2%2]

word[3] != word[3%2]

word[4] == word[4%2]

word[5] == word[5%2]

word[6] != word[6%2]

word[7] != word[7%2]

假設最小週期=4

word[0] == word[0%2]

word[1] == word[1%2]

word[2] == word[2%2]

word[3] == word[3%2]

word[4] == word[4%2]

word[5] == word[5%2]

word[6] == word[6%2]

word[7] == word[7%2]

如果if檢查發現不同就直接跳出,假設大一點的最小週期。如果相同就繼續檢查,直到最後一個字元。

在輸出的時候要注意格式,題目要求:

對於每組測資輸出一個整數,表示輸入字串的最小period。 兩個連續的輸出由空白行分隔。

空白行指的是每組測資的結果輸出後都要換行,最後一組就不用再換行,光是格式我就吃了好幾次的NA。

C++程式碼

#include <iostream>
using namespace std;

int main()
{
    long long int k, n;
    while(cin >> k && k != 0){
        for(int i = 9; i >= 0; i--) {
            if((10*k-i)%9 == 0){    //先判斷是否整除 而非先直接除再判斷是否為整數
                n = (10*k-i)/9.0;
                cout << n << " ";
            }
        }
        cout << endl;
    }
    return 0;
}

有興趣的可以參考一下~