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;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/85340619