public static boolean isPalindrome(int x) {
创新互联公司专注于企业成都全网营销、网站重做改版、吉林网站定制设计、自适应品牌网站建设、H5高端网站建设、商城网站建设、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为吉林等各大城市提供网站开发制作服务。
if (x0) { return false; }
int len=1;
for (len=1; (x/len) = 10; len*=10 );
while (x != 0 ) {
int left = x / len;
int right = x % 10;
if(left!=right){
return false;
}
x = (x%len) / 10;
len /= 100;
}
return true;
}
package JOptionPane;
import javax.swing.JOptionPane;
/**
* @author songml
*
*/
public class huiwen1 {
/**
* @param args
*/
public static void main(String[] args) {
//bFlg为true的时候,显示对话框
//bFlg为false的时候,不显示对话框,程序结束
boolean bFlg = true;
while (bFlg) {
String inputValue = JOptionPane.showInputDialog("请输入一个五位整数");
//什么都没有输入的时候的处理
if ("".equals(inputValue) ){inputValue ="0";}
//点击"取消"时候的处理
if (null == inputValue ) {bFlg = false;continue;}
//五位数判断
if (inputValue.length() !=5) {
JOptionPane.showMessageDialog(null, "请输入一个五位数");
//跳出本次(上面的那个)while,目的是不运行下面的回文数判断
continue;
}
long inputValueLong = Long.parseLong(inputValue);
long temp = inputValueLong;
long reverseLong = 0L;
//回文数判断
while (inputValueLong != 0) {
reverseLong = reverseLong * 10 + inputValueLong % 10;
inputValueLong = inputValueLong / 10;
}
if (reverseLong == temp) {
JOptionPane.showMessageDialog(null, "你输入的是回文数");
bFlg =false;
} else {
JOptionPane.showMessageDialog(null, "你输入的不是回文数");
}
}
System.exit(0);
}
}
这个问题,你可以逆向思考
现在出现的现象是无论输入什么,最终都会是回文,那也就是说,当执行
if(str1.equals(str2)){
System.out.println("是回文");}
else{
System.out.println("不是回文");}
一定都是执行的第一个打印语句
也就是说str1.equals(str2)一定返回true
也就是说这equals两个比较对象一定是相等,换句话说这个两个对象其实指的是一个对象,只是不同的引用名而已
也就是说str1和str2都是指的一个StringBuffer对象
也就是说reverse()方法是直接返回了本对象
查看源码证实:
/**
* @since JDK1.0.2
*/
@Override
public synchronized StringBuffer reverse() {
toStringCache = null;
super.reverse();
return this;
}
可以看到最终返回this,也就是返回的是本对象,也就证实了刚的想法
所以综上所诉,现在再来看一下整个代码的执行过程
创建了一个StringBuffer对象str1,里面包装的字符串是"上海自来水
"
打印对象str1,所以此时打印的是:上海自来水
给对象str1调用reverse()方法,此时并没有新创建一个StringBuffer,而是直接修改了str1里面的包装字符串,改为"水来自海上",并返回了str1对象给str2
所以str1和str2其实都指的是一个StringBuffer(里面包含的都是"水来自海上")
此时打印str2,当然显示的是"水来自海上",其实若这是你再打印哈str1就明白了,因为这个是str1也打印出来的是"水来自海上"
个人建议写法
因为你只是需要做一个回文的功能,因此可以只是把StringBuffer的reverse方法作为一个工具即可,所以建议如下写法
String str1 = "上海自来水";
System.out.println("原来的话为:"+str1);
String str2=new StringBuffer(str1).reverse().toString();
System.out.println("正话反说为:"+str2);
if(str1.equals(str2)){
System.out.println("是回文");}
else{
System.out.println("不是回文");}
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
String str1 = num + "";
// String str1 = Integer.toString(num);
// String str1 = String.valueOf(num);
StringBuilder str2 = new StringBuilder(str1);
str2.reverse();
int count = 0;
for (int i = 0; i str1.length(); i++) {
if (str1.charAt(i) != str2.charAt(i)) {
System.out.println(str1 + "不是回文数");
break;
} else {
count++;
}
}
if (count == str1.length()) {
System.out.println(str1 + "是回文数");
}
望采纳
按照你的要求编写的,输出从0到max中用二进制表示和十进制表示都是回文数的Java程序如下:
import java.util.Scanner;
public class CCF {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个整数:");
int max=sc.nextInt();
for(int i=0;i=max;i++){
String num = String.valueOf(i);
String num2=Integer.toBinaryString(i);
String reversenum=new StringBuffer(num).reverse().toString();
String reversenum2=new StringBuffer(num2).reverse().toString();
if(reversenum.equals(num) reversenum2.equals(num2)){
System.out.println(i+"用二进制表示"+num2+"和十进制表示"+i+"都是回文数");
}
}
}
}
运行结果:
请输入一个整数:1000
0用二进制表示0和十进制表示0都是回文数
1用二进制表示1和十进制表示1都是回文数
3用二进制表示11和十进制表示3都是回文数
5用二进制表示101和十进制表示5都是回文数
7用二进制表示111和十进制表示7都是回文数
9用二进制表示1001和十进制表示9都是回文数
33用二进制表示100001和十进制表示33都是回文数
99用二进制表示1100011和十进制表示99都是回文数
313用二进制表示100111001和十进制表示313都是回文数
585用二进制表示1001001001和十进制表示585都是回文数
717用二进制表示1011001101和十进制表示717都是回文数
1、可以把这个5个数分解存在一个数组里面
2、通过循环判断是否相等,循序次数就是长度整除2
在设置一个状态标记,为TRUE就是回数,为false就不是,在循环中,一旦不相等就把状态标记改为false,终止循环,当循环结束时,状态标记还是为true就是回数。
import java.util.Scanner;
/*
* 第三章 java运算符
* 课后作业 判断回文数
* 5.2.1 由用户输入一个整数,判断是不是回文数(完全对称的数),如果是 打印 true, 否则打印false
* 提示:本题仅要求判断一个五位数是不是回文数
* 通过除法运算和求模运算符,可以分别求出一个五位数的每位上的值,然后进行比较。
* Palindrome 回文数
*/
public class zuoye0352 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入要判断是否为回文数的数值:");
int i=sc.nextInt();
String str=""+i;
if(str.length()%2==0){
System.out.println(i+"不是回文数!"+str.length()%2);
}
//判断反转后 值是否相等 从而
else if(i==fanzhuan(i)){
System.out.println(i+"是回文数~");
}
else
System.out.println(i+"不是回文数!");
}
private static int fanzhuan(int input) {
int output = 0;//
while(input0){
//output= output*10;
output=output*10+input%10;
input=input/10;
}
return output;
}
}