1. 程式人生 > >Bailian2952 迴圈數

Bailian2952 迴圈數

2952:迴圈數
總時間限制: 1000ms 記憶體限制: 65536kB
描述
若一個n位的數字串滿足下述條件,則稱其是迴圈數(cyclic):將這個數字串視為整數(可能帶有前導0),並用任意一個 1 到 n 之間(包含1和n)的整數去乘它時, 會得到一個將原數字串首尾相接後,再在某處斷開而得到的新數字串所對應的整數。例如,數字 142857 是迴圈數,因為:
142857 *1 = 142857
142857 *2 = 285714
142857 *3 = 428571
142857 *4 = 571428
142857 *5 = 714285
142857 *6 = 857142。

請寫一個程式判斷給定的數是否是迴圈數。

注意:在此題中,輸入數字串允許帶前導0,且前導0不能被忽略,例如“01”是兩位數字串,而“1”是一位數字串。但將數字串轉化為整數做乘法運算或比較運算時,可以忽略前導0。

輸入
一行,一個長度在 2 到 60 位之間的數字串。
輸出
一個整數,若輸入的數字串是迴圈數,輸出1,否則輸出0。
樣例輸入
142857
樣例輸出
1
來源
1047

問題連結Bailian2952 迴圈數
問題描述:(略)
問題分析
    這個問題可以用模擬的方法來解決,但是計算量大一些。用數學計算的方法來解決,則比較簡潔。
    一個數如果乘以其位數加上1,結果為全9則為迴圈數,否則不為迴圈數。
    這個問題與參考連結是同一個問題,只是輸出結果形式略有不同。2個AC的程式改造了一下使用,結果一個AC,另外一個卻WA了,非常鬱悶。
程式說明

:(略)
參考連結UVALive2287 POJ1047 HDU1313 ZOJ1073 Round and Round We Go【大數+數學計算+水題】
題記:(略)

AC的C語言程式如下:

/* Bailian2952 迴圈數 */

#include <stdio.h>
#include <string.h>

#define BASE 10
#define N 60
char s[N + 1];

int main()
{
    int len, i;

    while(~scanf("%s", s)) {
        len = strlen(s);

        int ans = 0, flag = 1;
        for(i = len - 1; i; i--) {
            ans += (s[i] - '0') * (len + 1);
            if(ans % BASE != 9) {flag = 0; break;}
            ans /= BASE;
        }
        if(flag) {
            len = (len + 1) / 2;
            for(i = 0; i < len; i++) {
                if(s[i] + s[i + len] - 2 * '0' != 9) {
                    flag = 0;
                    break;
                }
            }
        }

        printf("%d\n", flag);
    }

    return 0;
}

WA的C語言程式如下:

/* Bailian2952 迴圈數 */

#include <stdio.h>
#include <string.h>

#define BASE 10
#define N 60
char s[N + 1];
int a[N+10];

int main(void)
{
    while(~scanf("%s", s)) {
        memset(a, 0, sizeof(a));

        int len = strlen(s);
        int k=0, left=0;
        int flag = 1;
        for(int i=len-1; i>=0; i--, k++) {
            int ans = (s[i] - '0') * (len + 1) + left;
            a[k] = ans % BASE;
            left = ans / BASE;

            if(a[k] != 9) {
                flag = 0;
                break;
            }
        }

        while(flag && left) {
            a[k] = left % BASE;
            left /= BASE;
            if(a[k] != 9) {
                flag = 0;
                break;
            }
            k++;
        }

        printf("%d\n", flag);
    }

    return 0;
}