这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321 、 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间[2022,2022222022]中有多少个数的形状像一座“山”。
解题思路:
先判断它是否为回文,再判断其是否递增,用计数器计数。
解题代码:
public class Main2 {
public static void main(String[] args) {
int count=0;
for(int i=2022;i<2022222022;i++){
if(ishuiwen(i))
if(isdizeng(i))
count++;
}
System.out.println(count);
}
public static boolean ishuiwen(int i) {
String s="" + i;
StringBuilder str = new StringBuilder(s);
if (str.reverse().toString().equals(s)) {
return true;
}
return false;
}
public static boolean isdizeng(int i){
String str = "" + i;
int len = str.length();
if(len%2!=0) {
len=len+1;
}
for (int j = 0; j < len / 2-1; j++){
if ((int)str.charAt(j) >(int)str.charAt(j + 1)) {
return false;
}
}
return true;
}
}
解题结果:
实验总结:
1.暴力法可以写出来但是时间有点长
2.在网上看到一种很简便的方法,通过取余求出各位上的数字进行比较。
public static boolean isPalindromeAndMonotonous(int num) {
if (num != 0 && num % 10 == 0 || num < 0) {
return false;
}
int reverseNum = 0;
while (num > reverseNum) {
int b = num % 10;
if (reverseNum % 10 > b) {
return false;
}
reverseNum = reverseNum * 10 + b;
num /= 10;
}
return reverseNum == num || reverseNum / 10 == num;
}