这篇文章讲述的是算法趣味整数部分的自守数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:5^2=25 , 25^2=625 , 76^2==5776 , 9376^2=87909376 求出100000以内的自守数。
算法分析
关键问题是判断自然数的位数和取出尾数,专门写判断位数和取出尾数的方法方便解决问题。
代码实现
package funnyInteger;
public class Q3_AutomorphicNumber {
/**
* 问题描述:自守数是指一个数的平方的尾数等于该数自身的自然数。例如:5^2=25 ,
* 25^2=625 , 76^2==5776 , 9376^2=87909376 求出100000以内的自守数。
*
* 算法分析:关键问题是判断自然数的位数和取出尾数,专门写判断位数和取出尾数的
* 方法方便解决问题。
*/
public static void main(String[] args) {
/*初始化范围*/
long end = 100000;
System.out.println(end+"以内的自守数有:");
/*循环判断1~end的每一个数是否为自守数*/
for(long i=0 ; i<=end ; i++){
/*判断数的位数*/
long length = getLength(i) ;
/*求该数的平方*/
long square = i*i ;
/*取出平方的尾数*/
long tail = getTail(square,length) ;
/*判断尾数是否和该数本身相等,即是否为完数*/
if(tail == i)
System.out.print(i + " ");
}
}
/*判断数的位数*/
private static long getLength(long number) {
int lenth = 1 ;
while(number/10 > 0){
lenth++ ;
number/=10 ;
}
return lenth;
}
/*取出number末尾length位数*/
private static long getTail(long number , long lenth) {
long tail = 0;
int a = 1;
for(int i=0 ; i<lenth ;i++)
a *= 10 ;
tail = number%a ;
return tail ;
}
}
样例输出
200000以内的自守数有:
0 1 5 6 25 76 376 625 9376 90625 109376