计算开平方回文数JAVA

随意输入一个7位数,计算出该7位数内能开平方的所有回文数。(回文数:指该数字正读和反读都是一样的,例如:1234321)

package com.huiwen;

import java.util.Scanner;
 
/**
 * 根据输入的整数返回回文数的demo
 * @author Administrator
 *
 */
public class HuiWenShuDemo {
    public static int huiwenCount = 0;
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入一个正整数:");
        int num = scanner.nextInt();
        if( ! (num>=1000000 && num<=999999999) ){
            System.err.println("输入的整数不是7位数。");
            return;
        }
 
        int end = (int)Math.sqrt(num);//取平方根
        int count = 0;
        for(int i = 4; i <= end; i++){
            //遍历1000000到num的平方数;
            int tmp = i * i;//计算平法
            System.out.println("tmp: " + tmp);
            if(isHuiWen(tmp)){
                System.out.println("回文数: " + tmp);
                count++;
            }
        }
        System.out.println("回文数个数:" + count);
  }
  public static boolean isHuiWen(int num){
    String numStr = num + "";
    int end = numStr.length() / 2;
    for(int i = 0; i < end; i++){
       if(numStr.charAt(i) != numStr.charAt( numStr.length() - i -1)){
            return false;
        }
    }
    return true;
  }
}


import java.util.Scanner;
 
/**
 * 根据输入的整数返回回文数的demo
 * @author Administrator
 *
 */
public class HuiWenShuDemo {
    public static int huiwenCount = 0;
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入一个正整数:");
        int num = scanner.nextInt();
        if( ! (num>=10 && num<=1000 ) ){
            System.err.println("输入的整数不满足规范。");
            return;
        }
        int total = calcNumTotal(num);
        calcHuiWenNum(total,num);
 
        if(huiwenCount==0){
            System.out.println("Impossible");
        }else{
            System.out.println("总共统计出回文数有"+ huiwenCount + "个!");
        }
    }
    
    /**
     * 根据传递的参数,返回该整数 所有数字之和
     * @param num
     * @return
     */
    public static int calcNumTotal(int num){
        int total = 0;
        String tempStr = String.valueOf(num);
        for (int i = 0; i < tempStr.length(); i++) {
            total = total + Integer.valueOf(tempStr.subSequence(i, i+1).toString());
        }
        return total;
    }
    
 
    /**
     * 根据传递的参数判断是否是回文数
     * @param num
     * @return
     */
    public static boolean isHuiWenNum(int newNum, int oldNum){
        if(oldNum >= newNum){
            return false;
        }
        String tempStr = String.valueOf(newNum);
        int tempLoop = tempStr.length() / 2;
        for(int i=0; i < tempLoop; i++){
            //System.out.println(tempStr.subSequence(i, i+1).toString() + "__" + tempStr.subSequence(tempStr.length()-i-1, tempStr.length()-i).toString());
            if(!tempStr.subSequence(i, i+1).toString().equals(tempStr.subSequence(tempStr.length()-i-1, tempStr.length()-i).toString())){
                return false;
            }
        }
        if(calcNumTotal(newNum)!=calcNumTotal(oldNum)){
            return false;
        }
        return true;
    }
    
    /**
     * 统计所有满足条件的回文数
     * @param total
     * @param oldNum
     */
    public static void calcHuiWenNum(int total, int oldNum){
        int tempLoop = total / 2;
        for(int i = 1; i < tempLoop; i++){
            int index = 1;
            int temp = total - 2 * i;
            calcHuiWenDetail(temp, i, oldNum);
        }    
    }    
    
    /**
     * 递归拆分当前传递的temp变量,取出满足条件的数字拼接之后匹配是否回文数
     * @param temp
     * @param i
     * @param oldNum
     */
    public static void calcHuiWenDetail(int temp, int i, int oldNum){
        if(temp >= 0){
            if(temp>9){ //大于9就会出问题,组成x的所有数字之和与组成y的所有数字之和不相等
                //这里还需要做处理,但是不会啊!!
            }
            String jiaVal = "";
            for(int j=0; j<i; j++){
                jiaVal += String.valueOf(i);
            }
            String newNum = jiaVal + String.valueOf(temp) + jiaVal;
            //System.out.println("newNum:" + newNum);
            if(newNum.length()>9){  //如果超过231次方就会报转换出错!
                return;
            }
            if(isHuiWenNum(Integer.valueOf(newNum).intValue(),oldNum)){
                System.out.println(newNum + ": 回文数!");
                huiwenCount++;
            }
            int temp_1 = temp - 2 * i;
            calcHuiWenDetail(temp_1, i, oldNum); //如果temp_1大于等于0就表示可以继续拆分。
        }
    }
}

详细参考: