1.求最大公约数和最小公倍数。
/**
* 求最大公约数
*/
public static int gongyue(int a, int b) {
int gongyue = 0;
if (a < b) { // 交换ab的值
a = a + b;
b = a - b;
a = a - b;
}
if (a % b == 0) {
gongyue = b;
}
while (a % b > 0) {
a = a % b;
if (a < b) {
a = a + b;
b = a - b;
a = a - b;
}
if (a % b == 0) {
gongyue = b;
}
}
return gongyue;
}
/**
* 求最小公倍数
* @param a
* @param b
* @return
*/
public static int gongbei(int a, int b) {
return a*b/gongyue(a,b);
}
public static void main(String[] args) {
System.out.println("最大公约数:" + gongyue(18, 12));
System.out.println("最小公倍数:" + gongbei(18, 12));
}
运行结果:

2.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:
将兔子的大小按生长月份规划,可以分为小中大,一个月大为小兔子,两个月大为中兔子,3个月及以上为大兔子。那么,每个月的大中小兔子数递推为:
月份 | 小兔子 | 中兔子 | 大兔子 | 总数 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 1 | 2 | 5 |
6 | 3 | 2 | 3 | 8 |
7 | 5 | 3 | 5 | 13 |
生长规律为:这个月中兔子为上一个月小兔子个数,这个月大兔子为上一个中兔子与大兔子的和,这个月小兔子个数为上个月大兔子数。
个数规律为:从第三个月起,每个月的个数为前两个月兔子数之和,即属于斐波那契数列,即得到如下calculateRabiit()函数。
public static int calculateRabiit(int month) {
if (month == 1 || month == 2) {
return 1;
} else {
return calculateRabiit(month - 1) + calculateRabiit(month - 2);
}
}
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
System.out.println("第" + i + "个月有" + calculateRabiit(i) + "只兔子");
}
}
运行结果:

3.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
public static void monkeyEadPeach() {
int totalNum = 1; //第10天为1个,依次倒着推前一天的桃子个数,直到第1天
for (int i = 9; i >= 1; i--) {
totalNum = (totalNum + 1) * 2;
}
System.out.println("桃子总共有" + totalNum + "个");
}
public static void main(String[] args) {
monkeyEadPeach();
}
运行结果:
桃子总共有1534个
4.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
分析:得出规律,下一项的分母是上一项的分子,下一项的分子是上一项的分母加分子。
public static void addSum(){
int a = 2; //用a表示分子
int b = 1; //用b表示分母
double totalSum = 0;
for (int i = 0; i < 20; i++) {
totalSum += (double) a / b;
//改变a和b的值变为下一项的分子分母的值
int temp = a;
a = a + b; //下一项的分子是上一项的分母加分子
b = temp; //下一项的分母是上一项的分子
}
DecimalFormat format = new DecimalFormat("#0.000");
System.out.println("前20项之和为 " + format.format(totalSum));
}
运行结果:
前20项之和为 32.660
5. 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
public static void fallDown() {
float curPath = 100;
float totalPath = 100; //第一次下下落的高度
totalPath += 100; //第二次下落上弹的距离
for (int i = 3; i <= 10; i++) {
curPath = curPath / 2; //当前次数经过的距离,每次距离为上次的一半,curPath为上下的距离之和
totalPath += curPath;
}
float fantan = curPath / 2;
System.out.println("总距离为" + totalPath + ",第10次反弹高度为" + fantan);
}
public static void main(String[] args) {
fallDown();
}
运行结果:
总距离为299.60938,第10次反弹高度为0.1953125
6.求1+2!+3!+...+10!的和
public static void product() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
int num = 1;
for (int j = 1; j <= i; j++) {
//第i项式
num *= j;
}
sum += num;
}
System.out.println("和为" + sum);
}
结果为:
和为4037913
7.用递归的方式求n的阶乘
public static int recursion(int n) {
if (n > 1) {
return n * recursion(n - 1); //n的阶乘为n乘以前一个数的阶乘,依次向前递归调用,但是在为1时停止
} else {
return 1;
}
}
public static void main(String[] args) {
System.out.println("4的阶乘为" + recursion(4));
System.out.println("5的阶乘为" + recursion(5));
System.out.println("6的阶乘为" + recursion(6));
}
结果为:

8.打印1000以内所有的水仙花数,水仙花数是指一个三位数,其各位数字立方和等于该数本身
/**
* 判断是不是水仙花数
* @param i
* @return
*/
public static boolean isNarcissus(int i) {
//设个位、十位、百位数字分别为a,b,c
int c = i % 10;
int b = i / 10 % 10;
int a = i / 100;
if (a * a * a + b * b * b +c * c * c == i) {
return true;
} else {
return false;
}
}
public static void printNarcissus() {
for (int i = 100; i < 1000; i++) {
if (isNarcissus(i)) {
System.out.println(i);
}
}
}
public static void main(String[] args) {
printNarcissus();
}
运行结果为:

9.将一个正整数分解质因数。例如:输入90,打印出90=2 * 3 * 3 * 5。
程序分析:
一个数n,将n从2遍历到自身,找各个质因数。如果n % i == 0,则i为n的一个质因数。如果i==n,则说明已经找完了,否则继续递归调用分解n/i。
public static void decompositionFactor(int n) {
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
//i为n的一个因数
System.out.print(i);
if (n != i) {
//未找完,还有其他因数
System.out.print(" * ");
}
decompositionFactor(n / i);
}
}
System.exit(0);
}
public static void main(String[] args) {
System.out.print(120 + " = ");
decompositionFactor(120);
}
运行结果:
120 = 2 * 2 * 2 * 3 * 5
10.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public static void statisticalCharacter() {
System.out.println("请输入一行字符");
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
int enChar = 0;
int spaceChar = 0;
int num = 0;
int otherChar = 0;
for (int i = 0; i < string.length(); i++) {
char character = string.charAt(i);
//用ASCALL码值进行匹配
if ((character >= 'A' && character <= 'Z') || (character >= 'a' && character <= 'z')) {
enChar++;
} else if (character == ' ') {
spaceChar++;
} else if (character >= '0' && character <= '9') {
num++;
} else {
otherChar++;
}
}
System.out.println("共有英文字母、空格、数字和其它字符个数分别为:" + enChar + " " + spaceChar + " " + num + " " + otherChar);
}
public static void main(String[] args) {
statisticalCharacter();
}
运行结果:

11.求s = a + aa + aaa + aaaa + aa...a的值,需要键盘输入a和n的值,n表示共有多少项。
分析,每一项都为上一项的值乘以10,再加上a。
假设第一项为0,第二项为010 + a = a,第三项为a10+a=aa,第四项为
aa*10+a=aaa,依次类推。
/**
*
* 例如输入a=2,n=5,打印出 2 + 22 + 222 + 2222 + 22222。
*/
public static void printN() {
System.out.println("请输入这个数a");
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println("请输入n的值");
int n = scanner.nextInt();
int last = 0; //上一个项式的值
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < n; i++) {
last = last * 10 + a;
if (i == n - 1) {
stringBuffer.append(last);
} else {
stringBuffer.append(last + " + ");
}
}
System.out.print(stringBuffer.toString());
}
public static void main(String[] args) {
printN();
}
运行结果:

12.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。
public static boolean isPerfectNumber(int num) {
int sum = 0; //因子的和
for (int i = 1; i <= num/2; i++) {
if (num % i == 0) { //遍历找出所有因子
//i为num其中一个因子
sum += i;
}
}
if (sum == num) {
return true;
} else {
return false;
}
}
public static void printPunPerfectNumber() {
for (int i = 1; i <= 1000; i++) {
if (isPerfectNumber(i)) {
StringBuffer sb = new StringBuffer();
sb.append(i + " = ");
for (int j = 1; j <= i/2; j++) {
if (i % j == 0) {
sb.append(j + " + ");
}
}
sb.deleteCharAt(sb.length()-2); //去除最后一个"+"
sb.append("\n");
System.out.print(sb.toString());
}
}
}
public static void main(String[] args) {
printPunPerfectNumber();
}
运行结果:

13.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
public static void compositionFigure() {
int totalCount = 0; //总个数
//从4个数里随机任选一个数出来,选3次
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
for (int k = 1; k <= 4; k++) {
//此时确保互不相同,但需剔除重复数字情况
if (i == j || i == k || j == k) {
continue;
}
totalCount++;
System.out.println(i + "" + j + "" + k);
}
}
}
System.out.println("总个数有:" + totalCount + "个");
}
public static void main(String[] args) {
compositionFigure();
}
运行结果:

14.一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
分析:一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数。这个数为num,那么就有num+100为一个整数n的平方,num+168为另一个整数m的平方,用%1为0的表达方式表示为一个整数。
public static void perfectSquareNumber() {
for (int i = 1; i <= 10000; i++) {
if ((Math.sqrt(i + 100) % 1 == 0) && (Math.sqrt(i + 168) % 1 == 0)) {
System.out.print("这个数是" + i);
}
}
}
public static void main(String[] args) {
perfectSquareNumber();
}
运行结果:
这个数是156
好了,以上就是练习题的主要内容,该文章会持续添加新题。
网友评论