首先我的题解应该偏麻烦,而且也没有经过润色,我之所以要写一篇是因为实在没人写,我不希望有人看到这个题发现不会然后一看题解发现根本没有。所以我会提供我的写法。
解题思路: 题比较麻烦有很多需要处理的零碎地方分给不同函数了,可能会比较麻烦,不过其实就是让多个数字和一个字符串比较。首先因为要进行数字的计算所以有一个把字符串变成数字的函数changeInt()把每一位拆出来就可以了,先拆个位,往前拆每一位多乘个10加起来就可以。第二个函数就是比较一个数字和字符串是否能循环对应了,首先考虑了先导0的情况,发现有先导0的情况下应该就不可能为循环数了,所以第一个if-false把字符串第一位为0的直接pass掉。然后就可以正式比较数字和字符串了,因为你算出来的数字顺序不是固定的,所以我的思路是先找到数字和字符串中对应的那一位,当然如果根本找不出对应的那一位也可以直接pass了,这是第二个if-false,找到之后我们就可以以此为基础向下遍历字符串和数字的每一位比较他们是否相等,如果每一位都相等就是true,如果出现了一位不相等就是false。最后那个函数是用来把字符串倒置之后返回的。
注意事项: 有一些小套路比如弄个flag这个大多数应该接触过,还有一个是在遍历字符串的时候i每递增一次要对字符串的总长度取余,这样如果有出现超出字符串长度的i就会循环到字符串的开头,如果你学过数据结构的队列应该对这个小把戏比较熟悉,也不用担心会重复遍历,因为可以用字符串总长度控制循环次数。你也可以注意到我遍历数字和字符串的方向其实是相反的,没错如果要图简单,数字会从个位开始便利往左走但是字符串却是随着i的增加一直向右遍历(到头再回到左边向右),所以直接写会错,但是换方法实在太麻烦了,所以我选择在isSame()函数的开头把字符串倒过来,这样就负负得正了。
参考代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.next();
int i,number,flag;
number = changeInt(n);
flag = 0;
for(i = 1;i <= n.length();i++){
if(!isSame(number * i,n)){
flag = 1;
break;
}
}
if(flag == 0)
System.out.println(1);
else
System.out.println(0);
}
public static int changeInt(String n){
int i,j,number;
for(i = n.length(),j = 1,number = 0;i > 0;i--) {
number += j * (n.charAt(i - 1) - 48);
j *= 10;
}
return number;
}
public static boolean isSame(int number,String n){
int i,flag,start,cnt;
n = reverse(n);
if(n.charAt(0) == 0)
return false;
else{
flag = 0;
for(i = 0;i < n.length();i++){
if((n.charAt(i) - 48) == number % 10) {
flag = 1;
break;
}
}
start = i;
if(flag == 0)
return false;
else{
int t = 10;
for(i = start,cnt = 0;cnt < n.length();i = (i + 1) % n.length(),cnt++){
flag = 0;
if(number % t != n.charAt(i) - 48){
flag = 1;
break;
}
number /= 10;
}
if(flag == 1)
return false;
else
return true;
}
}
}
public static String reverse(String input) {
StringBuilder reversed = new StringBuilder(input);
return reversed.reverse().toString();
}
}
0.0分
0 人评分