当前位置: 首页 > >

java面试趣味编程题

发布时间:

此为某次大公司面试编程题中的一道,花了点心思写出来分享给大家:
package luoji;

import java.util.ArrayList;

/**
* 如果一个数字能表示为p^q且p为一个素数,q为大于1的正整数就称这个数为超级素数幂。 现在给出一个正整数n,如果n是一个超级素数幂,需要找出对应的p,q.
* date:2017-04-18 17:34:01
* @author XXX
*收获:复*了递归,学*了Math函数库的两个新函数rint(double d)四舍五入和已知底数和结果求幂指数的方法log(结果)/log(底数);对函数执行过程有了更清晰的认识。
*/

public class TestSuperSuShuMi {
static int resultd = 0;
static int count = 0;

public static void main(String[] args) {
int p = 0;
int q = 0;
int n = 11;
Test(p, q, n);
}

private static void Test(int p, int q, int n) {
ArrayList<Integer> arr = SaveSuShuArr();
for (int i = 0; i < arr.size(); i++) {
// 判断i^q==n?
int result = digui(arr.get(i), n);
if (result != 0) {
p = arr.get(i);
q = result;
break;
}
}
System.out.println("p为" + p + ",q为" + q);
System.out.println("公式为:" + n + "=" + p + "^" + q);
// Math.rint(double d)四舍五入
// q=(Math.log(n) / Math.log(p) ---->n=p^q
System.out.println("正确公式为" + n + "=" + p + "^" + (int) (Math.rint((Math.log(n) / Math.log(p)))));
}

/**
*
* @param p为题中底数p
* @param n为题中正整数n
* @return 为题中幂指数q
*/
private static int digui(int p, int n) {
if (n % p != 0) {
return 0;
} else if (resultd != 1) {
resultd = n / p;
count++;
digui(p, resultd);
}
return count;
}

/*
* 得到一千以内的素数数组
*/
private static ArrayList<Integer> SaveSuShuArr() {
ArrayList<Integer> arr = new ArrayList<>();
for (int i = 2; i < 1002; i++) {
int num = FindSuShu(i);
if (num != 0) {
arr.add(num);
}
}
// for (Integer integer : arr) {
// System.out.println(integer.toString());
// }
return arr;
}

/*
* 将1000以内的素数存入数组
*/
public static int FindSuShu(int su) {
if (su == 2) {
return su;
} else {
// 一个数只能被1和它本身整除
for (int i = su - 1; i > 1; i--) {
if (su % i == 0) {// 不是素数
// System.out.println(su + "不是素数");
break;
} else {
if (i == 2) {
return su;
}
}
}
}
return 0;
}
}



友情链接: