TOJ 1563 Round and Round We Go (弃9数)

题目就是判断一个数(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");
		}
	}
}

你可能感兴趣的:(TOJ)