编写一个SpecialNum类,包括:
方法:
1) narcissus():输出所有“水仙花数”。
(水仙花数:一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 =153).
2) prime( ):输出1000以内的所有素数。
3) palindrome ( ):输出1000以内的“回文数”。(回文数:正序(从左向右)和倒序(从右向左)读都是一样的整数,比如1221)
4) perfectNum( ):输出1000以内的“完数”。(完数:一个数恰好等于它的因子之和。如6的因子是1,2,3,6=1+2+3,因此6是完数。)
5) printMenu():输出操作菜单内容:
*****************************************************
请选择:
1、求水仙花数;2、求素数;3、求回文数;4、求完数、0、退出
******************************************************
编写main方法:定义循环,在循环中先显示菜单,然后用户输入选择,根据用户的选择执行相关的方法输出这些特殊的数,如果用户输入0或其他值,结束循环。
想法:
因为方法1和方法3都需要判断不同位数的关系所以我在编写过程中把这两部分合并达到减少运算次数的目的
同时由于判断内容不变保存4个方法的运算结果可以节省运算次数所以也就这么写了
声明:
判断素数的方法是借鉴素数判断的方法中的素数筛选法(虽然他写的不是很好)
判断完数的方法是借鉴百度百科-完全数中Java部分的实现(虽然我看的过程中没搞懂)
package game;
import java.util.Arrays;
import java.util.Scanner;
public class project {
public static void main(String[] args) {
boolean S = true;
Scanner in = new Scanner(System.in);
Num aNum = new Num();
aNum.printMenu();
do {
switch(in.nextInt()) {
case 1 : aNum.narcissus(); break;
case 2 : aNum.prime(); break;
case 3 : aNum.palindrome(); break;
case 4 : aNum.perfectNum(); break;
default : S = false; break;
}
}while(S);
in.close();
}
}
interface Special{
int N = 1000;
void narcissus();
void prime();
void palindrome();
void perfectNum();
void printMenu();
}
class Num implements Special{
private boolean[] number = new boolean[N+1];
private int[][] Number = new int[4][];
private int[][] Num = new int[4][];
private boolean[] Ex = new boolean[4];
/*
*将两个步骤合并,并且保存运算记录达到节省运算次数
*/
private void search() {
int a, b, c,d;
Number[0] = new int[N/2];
Number[2] = new int[N/2];
int j = 0,k = 0;
final int Three = 3;
for(a = 0 ; a <= 9 ; a++)
for(b = 0 ; b <= 9 ; b++)
for(c = 0 ; c <= 9 ; c++) {
if(a > 0 && Math.pow(a, Three) + Math.pow(b, Three) + Math.pow(c, Three) == a*100 + b*10 + c)
Number[0][k++] = a*100 + b*10 + c;
for(d = 0 ; d <= 9 ; d++)
if(a > 0 && a == d && c == b)
Number[2][j++] = a*1000 + b*100 + c*10 + d;
}
Ex[0] = Ex[2] = true;
Num[0] = new int[k];
Num[2] = new int[j];
System.arraycopy(Number[0], 0, Num[0], 0, k);
System.arraycopy(Number[2], 0, Num[2], 0, j);
}
/*
* 1) narcissus():输出所有“水仙花数”。
(水仙花数:一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 =153).
*/
public void narcissus() {
if(Ex[0] != true) {
this.search();
}
System.out.println(Arrays.toString(Num[0]));
}
/*
* 2) prime( ):输出1000以内的所有素数
*/
public void prime() {
if(Ex[1] != true) {
Number[1] = new int[N/2];
int i, j;
int k = 0;
Number[1][k++] = 2;
for(i = 2 ; i <= Math.sqrt(N) ; i++) {
for(j = i*i ; j <= N ; j += i)
this.number[j] = true;
for(i++ ; number[i] ; i++);
Number[1][k++] = i;
}
Num[1] = new int[k];
System.arraycopy(Number[1], 0, Num[1], 0, k);
Ex[1] = true;
}
System.out.println(Arrays.toString(Num[1]));
}
/*
* 3) palindrome ( ):输出1000以内的“回文数”。(回文数:正序(从左向右)和倒序(从右向左)读都是一样的整数,比如1221)
*/
public void palindrome() {
if(Ex[2] != true) {
this.search();
}
System.out.println(Arrays.toString(Num[2]));
}
/*
* 4) perfectNum( ):输出1000以内的“完数”。(完数:一个数恰好等于它的因子之和。如6的因子是1,2,3,6=1+2+3,因此6是完数。)
*/
public void perfectNum() {
if(Ex[3] != true) {
Number[3] = new int[N/2];
int k = 0;
int sum = 0;
int i = 2,j = 1;
for(i = 2; i <= N; i++){
for(j = 1; j < i; j++){
if(i%j == 0)
sum = sum+j;
}
if(sum == i) {
Number[3][k++] = sum;
}
sum = 0;
}
Num[3] = new int[k];
System.arraycopy(Number[3], 0, Num[3], 0, k);
Ex[3] = true;
}
System.out.println(Arrays.toString(Num[3]));
}
/*
* 5) printMenu():输出操作菜单内容:
*****************************************************
请选择:
1、求水仙花数;2、求素数;3、求回文数;4、求完数、0、退出******************************************************
*/
public void printMenu() {
System.out.printf("*****************************************************\n");
System.out.printf("请选择:\n" +
"1、求水仙花数;2、求素数;3、求回文数;4、求完数、0、退出\n"
+ "******************************************************\n");
}
}
总结:
接口的入门步骤已经掌握了一些,本想使用键盘监听但是不熟练也没用过所以想法从脑子就飘走了