目录
5、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
7、求一行字符,分别统计出其英文字母、空格、数字和其它字符的个数。
10、完数,除它本身的因数相加等于它自己,如: 6=1+2+3
12、一球从h米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?
1、古典问题:不死兔子
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
公式:a[n]=a[n-1]+a[n-1]
//使用递归求解
private static int fun(int n){
if(n==1 ||n==2)
return 1;
else
return fun(n-1)+fun(n-2);
}
2、判断是不是素数
private static boolean IsRightNum(int i) {
for (int j = 2; j < Math.sqrt(i);j++) {
//如果能整除,就说明不是素数,可以马上中断,继续对下一个数判断
if (i%j==0) {
return false;
}
}
return true;
}
3、判断是不是回文数
public static boolean palindrom(Integer num) {
String s1 = String.valueOf(num);
String s2 = new StringBuilder(s1).reverse().toString();
return s1.equals(s2);
}
4、判断是不是水仙花数
private static boolean IsRightNum(int i) {
//百位
int a = i/100;
//十位 int b = i/10%10
int b = i%100/10;
//个位
int c = i%10;
if((a*a*a)+(b*b*b)+(c*c*c)==i)
return true;
return false;
}
5、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
思路:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
如果它可以整除4,那么它一定可以整除2,被除数不断判断累加上去可以保证绝对不会错过。最后i和num相等是就跳出循环,增加最后的结果质数。
public static void decomposeNum(int num){
int res = num;
StringBuilder s = new StringBuilder();
for (int i = 2; i <= num; i++) {
while (num%i==0&&i!=num){
num/=i;
s.append(i+"*");
}
}
s.append(num+"="+res);
System.out.println(s.toString());
}
6、输入两个正整数m和n,求其最大公约数和最小公倍数。
思路:
最大公约数:几个数共有因数中最大的一个。如:12和18。12的因数有:1、12、2、6、3、4。18的因数有1、18、2、9、3、6。共有的因数:1、2、3、6。所以6就是12和18的最大公因数。
最小公倍数:几个数公有的倍数中最小的一个。如4的倍数有4、8、12、16...;6的倍数有6,12,18...;则最小公倍数是12。
最大公约数和最小公倍数的求法:先求最大公约数,就可以很方便获得最小公倍数。最小公倍数=两数乘积/最大公约数。最小公倍数就不展示代码,直接代入公式计算即可。
求最大公约数的方法:
(1)用大的数对小的数求余
(2)把小的数赋值给大的数,把求余获得的结果赋值给小的数
(3)循环上一步的操作,直到求余的结果为零
(4)最后一步的被除数就是最大公约数
public static void decomposeNum(int a,int b){
//保证a大于b,否则就交换位置,否则后续无法取余。
if (a<b){
int i = a;
a=b;
b=i;
}
while (a%b!=0){
int c = a%b;
a = b;
b = c;
}
return b;
}
7、求一行字符,分别统计出其英文字母、空格、数字和其它字符的个数。
str.length()-str.replaceAll("[a-zA-Z]","").length();
str.length()-str.replaceAll(" ","").length();
str.length()-str.replaceAll("\\d","").length();
str.length()-str.replaceAll("[^a-zA-Z]\\d ","").length();
8、数组排序
public static Integer[] sortByArrays(Integer... arr) {
//降序
Arrays.sort(arr,(x, y) -> y - x);
//升序
Arrays.sort(arr);
//倒序
List<Integer> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray(new Integer[arr.length]);
return arr;
}
9、字符串逆序
StringBuilder.reverse()或者StringBuffer.reverse()
10、完数,除它本身的因数相加等于它自己,如: 6=1+2+3
private static boolean IsRightNum(int i) {
int sum = 0;
for (int j = 1; j <= i/2;j++) {
if (i%j==0) {
sum+=j;
}
}
if (sum==i) {
return true;
}
return false;
}
11、统计字符串中子串出现的次数
String.indexOf(String str),返回此字符串中第一次出现指定子字符串的索引。
str = str.substring(i + s.length());
count++;
12、一球从h米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第n次落地时,共经过多少米?第n次反弹多高?
public static double[] pinBall(double h, int n) {
double s = h;
for (int i = 1; i < n; i++) {
h = h / 2;
s += 2 * h;
}
return new double[]{s, h};
}
13 猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下 的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
逆向思维:剩下的加一个就是前一天的一半。剩下的加一乘以2就是前一天的总量
public static int peach(int dayNum) {
int total = 1;
for (int day = 1; day < dayNum; day++) {
total = 2 * (total + 1);
}
return total;
}