题目就是判断一个数(2-60位) 是不是‘circle number’ , 就是原数乘上(1-len) 之后得到的每个数都是 这个数‘wrap’ 之后的,就是依次把最后的数字放到最前面得到的数;
先说比较麻烦的办法的,直接模拟,(还是偷懒用了java 的BigInteger);
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner in= new Scanner(System.in);
while(in.hasNext())
{
String s=in.next();
String tmp=s;
int len= s.length();
String[] list= new String[65];//存储原数的衍生的数组
boolean[] flag =new boolean[65];//用来标志是否用过
list[0]=s;
int k=1;
for (int i=0;i<len-1;i++)
{
tmp=tmp.substring(1)+tmp.charAt(0);//每次将尾字符放到最前面
list[k++]=tmp;
flag[k]=false;//初始化
}
BigInteger t= new BigInteger(s);
boolean tag=true;
for (int i=1;i<=len&&tag;i++)
{
String mut=t.multiply(new BigInteger(String.valueOf(i))).toString();
while(mut.length()<len)
{//题目中说了,并不排除以0开头的数字,因此需要考虑大数相乘之后的开始的0被抹去;
mut='0'+mut;
}
int j;
for( j=0;j<k;j++)
{
if(!flag[j]&&list[j].equals(mut))
{
flag[j]=true;break;
}
}
if(j>=k)tag=false;//没有匹配到对应list中的数字
}
if(tag)
{
System.out.println(s+" is cyclic");
}
else System.out.println(s+" is not cyclic");
}
}
}
后来看题解的时候,看到另一个很简便的算法, 并且 涉及到某些数学知识;
粘过来了:
只要输入的数*(len+1)=9....9(共len个)
len=输入数的长度:原理据说是: 弃9法--(不明觉厉)权当科普吧==:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner in= new Scanner(System.in);
while(in.hasNext())
{
String s=in.next();
String tmp=s;
String ss="";
int len =s.length();
BigInteger t= new BigInteger(s);
for (int i=0;i<len;i++)
ss=ss+'9';
s=t.multiply(new BigInteger(String.valueOf(len+1))).toString();
if(s.equals(ss)) System.out.println(tmp+ " is cyclic");
else System.out.println(tmp+ " is not cyclic");
}
}
}