1:九九乘法表:
2:冒泡排序
外层循环n-1 内层循环n-1-i
3:100以内的素数
4:鸡兔同笼问题:
鸡 兔 共35只头 94只脚。 求鸡和兔数量各多少只?
5:兔子生崽问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?
分析:兔子的规律为数列1,1,2,3,5,8,13,21。。。。
f(1) = 1(第1个月有一对兔子)
f(2) = 1(第2个月还是一对兔子)
f(3) = 2(原来有一对兔子,第3个开始,每个月生一对兔子)
f(4) = 3(原来有两对兔子,有一对可以生育)
。。。。。
由以上可以看出,第n个月兔子的对数为
f(n) = f(n - 1) + f(n - 2);
这是 斐波那契数列,规律是:从第三个数开始,每个数都是前两个数的合.最简单的方法就是 递归
6:100-999中的水仙花数:个位十位百位分别三次方加和等于自身;
7:正整数分解质因数
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
对n进行分解质因数,应先找到一个最小的质数i
1、如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
2、如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。
3、如果n不能被i整除,则用i+1作为i的值,重复执行第一步。
8:输入两个正整数m和n,求其最大公约数和最小公倍数。
利用辗除法。
例如:求4453和5767的最大公约数时,可作如下除法.
5767÷4453=1余1314
4453÷1314=3余511
1314÷511=2余292
511÷292=1余219
292÷219=1余73
219÷73=3
于是得知,5767和4453的最大公约数是73.
public class hello {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个数字:");
int a=sc.nextInt();
System.out.print("请输入第二个数字:");
int b=sc.nextInt();
System.out.println("最大公约数为:"+MaxCommonDivisor(a,b));
System.out.println("最小公倍数为:"+MinCommonMultiple(a,b));
}
private static int MaxCommonDivisor(int a,int b) {
if(a < b){
int temp = a;
a = b;
b = temp;
}
while(a % b !=0){
int temp = a % b;
a = b;
b = temp;
}
return b;
}
private static int MinCommonMultiple(int a, int b){
return a * b / MaxCommonDivisor(a, b);
}
}
9:题目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。
10: 6=1+2+3. 找出1000以内的所有完数(一个数如果恰好等于它的因子之和)
11:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,
求它在 第10次落地时,共经过多少米?第10次反弹多高? 弹球是一上一下的距离
12:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
13:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
数值100万以内进行判断,先将该数加上100后再开方,再将该数加上168后再开方。 Math.sqrt(i+100)
14:输入某年某月某日,判断这一天是这一年的第几天?
15:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
采取逆向思维的方法,从后往前推断。
天 数 1 2 3 4 5 。。。10
桃子数 1 4 10 22 46 。。。
所以桃子数计算方法:前一天桃子数(当前天桃子数量 + 1)* 2
用递归方法如下:
public class hello {
public static void main(String[] args) {
System.out.println(peach(10));
}
private static int peach(int x) {
if(x == 1){
return 1;
}else{
return (peach(x-1) + 1) * 2; //n-1 意思为 第十天就是第(10-1)项 来表示的
}
}
}
输出的结果为:猴子第一天所摘的桃子数量为:1534
普通方法如下:
public class hello {
public static void main(String[] args) {
int sum =0;
for(int i = 1; i <= 10; i++){
if(i == 1)
sum = 1;
else
sum = (sum + 1) * 2;
}
System.out.println("猴子第一天所摘的桃子数量为:"+ sum);
}
}
输出结果同上。
16:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13,可以观察到,从第3个数开始,
每个数的值都等于前连个数之和。
同时,定义f(0) = 0,
f(1) = 1,
则 f(2) = f(1)+ f(0) = 1,
f(3) = f(2)+ f(1) = 2...
依次类推,f(n) = f(n-1) + f(n-2)
动态规划:
或 运用递归调用:
17:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
其中 n 个台阶中有可以一次跳n级既: 在起初 一级跳 二级跳有结论 f(n) = f(n-1)+f(n-2)
f(1) = 1
f(2) = f(2-1) + f(2-2)
f(3) = f(3-1) + f(3-2) + f(3-3) f(3-3)就是跳3级阶梯
...
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)
这里f(n)倒序转换即:
f(n) = f(0) + f(1) + f(2) + f(3) + ... + f(n-1)
其中:这里的f(n) 代表的是n个台阶有一次1,2,...n阶的 跳法数。
那根据f(n) 提前写f(n-1) 那么:
f(n-1) = f(0) + f(1) + f(2) + f(3) + ... + (f(n-1)-1)
那f(n) = f(n-1) + f(n-1)
= 2 * f(n-1)
递归调用:
或动态规划
青蛙你乖,没事儿别出来瞎逛,怪累的。你孩子还在找你,赶紧回河里去,再不走就要被端上锅了,谢谢!
18:两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人,比赛名单已定,有打听知,A说他不和X比,C说不和X和Z比,编程找出比赛名单
19:打印图案:菱形
假设是一到四到一 : 1 3 5 7 5 3 1 前四位2n-1 后三位倒叙 2n-1
20: 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
分析:下一项的 分母 等于 前一项的 分子+分母;
下一项的 分子 等于 前一项的 分子;
21: 求1+2!+3!+...+20!的和。
方法二:
22:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
利用递归的方法,递归分为回推和递推两个阶段。
要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推
23:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
public class hello {
public static void main(String[] args) {
// 请输入一个5位以内的正整数
System.out.print("请输入一个5位以内的正整数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if (n < 0 || n > 1000000)
System.out.println("输入有误,请重新输入");
else
System.out.println("这个数为" + getDigits(n) + "位");
reversePrint(n);
}
// 获取这个数的位数
public static int getDigits(int n) {
int count = 0; // 记录位数
while (n > 0) {
count++;
n /= 10;
}
return count;
}
// 逆序打印
private static void reversePrint(int n) {
System.out.print("逆序输出: ");
while (n > 0) {
System.out.print(n % 10 +" ");
n /= 10;
}
}
}
24: 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
将输入的数字转化为数组判断所在位置的数值是否相等
25:求一个3 * 3矩阵对角线元素之和
利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
法二:未明白
26:取一个整数a从右端开始的4~7位。
27:打印出杨辉三角形
public class hello {
public static void main(String[] args) {
int[][] arr=new int[10][10];
//给第一个位置赋值为1
for(int i=0;i<arr.length;i++){
arr[i][0]=1;
}
//给其他地方赋值,计算中间的值
for(int i=1;i<arr.length;i++){
for(int j=1;j<arr.length;j++){
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
}
//调节输出的格式
for(int i=0;i<arr.length;i++){
for(int k=0;k<arr.length-i;k++){
System.out.print(" ");
}
for(int j=0;j<arr.length;j++){
if(arr[i][j]!=0){
System.out.printf("%4d",arr[i][j]);
}
}
System.out.println();
}
}
}
输出如下结果:
28:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
1、先判断是奇数还是偶数
2、分数分子都是一,偶数分母从2开始,奇数的分母从1开始,分母差值都为2
public class hello {
public static void main(String[] args) {
System.out.println("请输入一个正整数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if(num%2 == 0){
System.out.println("1/2+1/4+...+1/"+num+"="+even(num));;
}else{
System.out.println("1/1+1/3+...+1/"+num+"="+odd(num));;
}
}
//偶数
public static double even(int num){
double sum = 0;
for(int i = 2;i <= num;i = i+2){
sum += 1.0/i;
}
return sum;
}
//奇数
public static double odd(int num){
double sum = 0;
for(int i = 1;i<= num; i = i+2){
sum += 1.0/i;
}
return sum;
}
}
输出结果:
29: 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
这个用逆向思维 这其实就是一个递归问题每次 * 5 +1
5 4 3 2 1
桃子个数 6 31 156 781 3906
猴子拿的个数 1 6 31 156 781
即:f(n - 1) * 5 + 1 f(n-1) 表示平分时候桃子的数量
30:求0—7所能组成的奇数个数。