【基础】循环数 【模拟】

1096: 【基础】循环数【模拟】

时间限制: 1 Sec  内存限制: 128 MB
提交: 426  解决: 283
[
提交][状态][讨论版]

题目描述

描述

n 位的一个整数是循环数(cyclic)的条件是:当用一个 1 n 之间的整数去乘它时, 会得到一个将原来的数首尾相接循环移动若干数字再在某处断开而得到的数字。也就是说,如果把原来的数字和新的数字都首尾相接,他们得到的环是相同的。只是两个数的起始数字不一定相同。例如,数字 142857 是循环数,因为
142857 *1 = 142857 
142857 *2 = 285714 
142857 *3 = 428571 
142857 *4 = 571428 
142857 *5 = 714285 
142857 *6 = 857142 

输入

输入

写一个程序确定给定的数是否是循环数。输入包括多个长度为 2 位到 60 位的整数。(注意,先导的0也是合理的输入不应该被忽略,例如 "01" 2 位数,"1" 1 位数。)

输出

输出

对于每一个输入的整数,输出一行表明它是否是循环数。

样例输入

142857

142856

142858

01

0588235294117647

样例输出

142857 is cyclic

142856 is not cyclic

142858 is not cyclic

01 is not cyclic

0588235294117647 is cyclic

 

 

思路:将一开始输入的数转变为字符串,获取其位数n之后,在n次循环的乘积里面,将每个乘积结果都转变为字符串并与之相比较,若有不同,则将控制判断的flag设为false并跳出循环,输出"非循环数"的结果。否则输出"循环数"的结果。

 

代码:
package com.eangaie.main;

 

import java.util.*;

 

public class M1096 {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        Scanner in = new Scanner(System.in);

        String s,str, str1;

        long num;

        int n;// 位数

        char[] arr, arr1;

        String a=" is cyclic",b=" is not cyclic";

        boolean flag;// 用来判断是否为循环数

        while (in.hasNext()) {

            flag = true;

            s = in.next();

            str=s;

            num = new Long(str);

            n = str.length();// 获取str的长度(位数)

            arr = str.toCharArray();

            Arrays.sort(arr);

            str = fn(arr);// 获得从小排到大的字符串

            for (int i = 2; i <= n; i++) {

                num *= i;

                str1 = String.valueOf(num);// 把乘积再转化为字符串

                arr1 = str1.toCharArray();

                Arrays.sort(arr1);

                str1 = fn(arr1);

                num /= i;

                if (!str1.equals(str)) {// 若相乘后的数所有的位数没有全部等于原来的所有位数,则不是循环数

                    flag = false;

                    break;

                }

 

            }

 

            if (flag) {

                System.out.println(s+a);

            } else {

                System.out.println(s+b);

            }

 

        }

    }

 

    static String fn(char[] arr) {

        String s = "";

        for (char c : arr) {

            s += c + "";

        }

        return s;

    }

}

转载于:https://www.cnblogs.com/w53064/p/8427287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值