java50道经典逻辑题_第1页
java50道经典逻辑题_第2页
java50道经典逻辑题_第3页
java50道经典逻辑题_第4页
java50道经典逻辑题_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?【程序 1 】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?分析: 咋一看不知道如何下手, 但是你在草稿纸上写写分析一下, 就很快发现其中的规律了package logic; import java.util.Scanner; public class RabbitNum public static void main(String args) S

2、canner in = new Scanner(System.in); System.out.println( 你想知道前几个月的兔子的数量); int month = in.nextInt(); int mon = new intmonth; if(month 3) System.out.println( 第 + month + 个月有 1 对兔子,共2 只); else for(int i = 2; i month; i+) mon0 = mon1 = 1; moni = moni - 1 + moni - 2; System.out.printf( 第 %d 个 月有 %d 对兔子,共%

3、d 只兔子 n, i + 1, moni, 2 * moni); 【程序 2 】题目:判断101-200 之间有多少个素数,并输出所有素数。分析:如果知道素数是什么,该题就应该不难了package logic; public class Prime public static void main(String args) System.out.print(101-200 中的素数有: ); for(int i = 101; i = 200; i+) if(isPrime(i) System.out.print( + i); /isPrime 方法用来判断一个数是否是素数 private sta

4、tic boolean isPrime(int i) / TODO Auto-generated method stub for(int j = 2; j = Math.sqrt(i); j+) if(i % j = 0) return false; return true; 【程序 3 】题目:打印出所有的水仙花数 ,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如: 153 是一个 水仙花数 ,因为 153=1 的三次方 5 的三次方 3 的三次方。分析:解决这个题目主要要知道怎么把一个数的各个位上的数拆分出来package logic; import java.util.S

5、canner; public class NarcissisticNum public static void main(String args) Scanner in = new Scanner(System.in); System.out.print( 水仙花数有: ); for(int num = 100; num k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n 不能被 k 整除,则用 k+1 作为 k 的值 ,重复执行第一步。分析:按步骤实现就可以了(有多种实现方式,以下代码供参考。我也参考了别人的)package logic;

6、 import java.util.Scanner; public class PrimeFactorOfInteger public static void main(String args) Scanner input = new Scanner(System.in); System.out.println( 请输入一个大 于 3 的 正 整 数 ); int num = input.nextInt(); System.out.print(num + 的 素 因 数 :); factor(num); private static void factor(int num) / TODO Au

7、to-generated method stub for(int i = 2; i = Math.sqrt(num); i+) if(num % i = 0) System.out.print(i + * ); if(isPrime(num / i) System.out.println(num / i); else factor(num / i); break; private static boolean isPrime(int i) / TODO Auto-generated method stub for(int j = 2; j =90 分的同学用 A 表示, 60-89 分之间 的

8、用B表不,60分以下的用C表不。分析:这题应该是最简单的吧package logic; import java.util.Scanner; public class ConditionalOperator public static void main(String args) Scanner in = new Scanner(System.in); System.out.println( 请输入你的分数); int score = in.nextInt(); if(score = 90) System.out.println(A 恭喜 ); else if(score = 60) Syste

9、m.out.println(B 不错 ); else System.out.println(C 加油 ); 【程序 6 】题目:输入两个正整数m 和 n ,求其最大公约数和最小公倍数。分析:需要了解求最大公约数和最小公倍数的方法package logic; import java.util.Scanner; public class Example6 public static void main(String args) Scanner in = new Scanner(System.in); System.out.println( 请输入第一个数 ); int a = in.nextInt

10、(); System.out.println( 请输入第二个数 ); int b = in.nextInt(); System.out.println( 这 两个数的最大公约数是 + MaxCommonDivisor(a, b); System.out.println( 这两个数的最小公倍数是 + MinCommonMultiple(a, b); private static int MaxCommonDivisor(int a, int b) / TODO Auto-generated method stub if(a b) int temp = a; a = b; b = temp; wh

11、ile(a % b != 0) int temp = a % b; a = b; b = temp; return b; private static int MinCommonMultiple(int a, int b) / TODO Auto-generated method stub return a * b / MaxCommonDivisor(a, b); 【程序 7 】题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。分析:这题也比较简单,知道怎么表示字母、空格、数字就OKpackage logic; import java.util.Scanner; pub

12、lic class Statistic public static void main(String args) Scanner in = new Scanner(System.in); System.out.println(Input one sentance.); String s = in.nextLine(); int letter = 0, symbol = 0, space = 0, number = 0; char strArray = s.toCharArray(); for (int i = 0; i strArray.length; i+) char c = strArra

13、yi; if('a' = c& c = 'z') | ('A' = c & c = 'Z') letter+; else if(48 = c &c = 57) / 注意!数字 0-9 的 ASCII码是 48-57 number+; else if(c = ' ') space+; else symbol+; System.out.println(This sentance have + letter + letters, ); System.out.println(have + number + numbers,

14、 ); System.out.println(have + space + spaces, + and + symbol + symbols.); 8】题目:求 s=a+aa+aaa+aaaa+aa.a的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此 时共有 5 个数相加 ),几个数相加有键盘控制。分析:其实跟分解一个数的各个位数的方法类似package logic; import java.util.Scanner; public class Example8 public static void main(String args) Scanner input =

15、 new Scanner(System.in); System.out.println( 请输入相加的基数); int n= input.nextInt(); System.out.println( 请输入要相加的个数 ); int i = input.nextInt(); long total = 0L; long temp = n; for(int j = 0; j i; j+) total += temp; temp = temp * 10 + n; System.out.println( 和为 + total); 【程序9 】题目:一个数如果恰好等于它的因子之和,这个数就称为完数。例如

16、 6=1 2 3.编程 找出 1000 以内的所有完数。分析:跟求一个数的素因数有类似的地方,但这里的因子可以不是素数package logic; import java.util.Scanner; public class WholeNumber public static void main(String args) System.out.println(1000 以内的完数有: ); for(int num = 1; num 1000; num+) isWholeNumber(num); private static void isWholeNumber(int num) / TODO

17、Auto-generated method stub int sum = 0; for(int i = 1; i = num / 2; i+) if(num % i = 0) sum += i; if(sum = num) System.out.println(num); 【程序10】题目:一球从100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10 次落地时,共经过多少米?第10 次反弹多高?分析:注意弹球一上一下的距离package logic; import java.util.Scanner; public class Pinball public static

18、void main(String args) Scanner in = new Scanner(System.in); System.out.println( 请输入原始高度。 ); double s = in.nextDouble(); System.out.println( 要求第几次落地后的距离。 ); int n = in.nextInt(); double total = s; System.out.printf( 第 %d 次落地后共走的 距离是: , n); if(n = 1) System.out.println(total); System.out.printf( 第d 次反

19、弹的距离是 f。, n, s / 2); else for(int i = 1; i n; i+) s = s / 2; total += 2 * s; / 一上一下共两倍的弹跳距离 System.out.print(total);System.out.println(); System.out.printf(第 %d 次反弹的距离是 f。,n, s / 2); 【程序 11】题目:有1 、 2、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?分析: 这里不免会联想到高中学的排列组合, 但这里并不能用排列组合解决问题。这里其实不难,用三层循环,去掉不合要求的就行了pa

20、ckage logic; public class Three_digitNum public static void main(String args) int i, j, k; / 分别代表个、十、百位int num; /用来输出符合要求的三位数 int count = 0;/ 用 来 统 计符合要求的三位数有多少个System.out.println( 符合要求的三位数有: ); for(i = 1; i = 4;i+) for(j = 1; j = 4; j+) if(i != j) / 提前把有重复的部分情况过滤掉, 减少运行次数,优化性能 for(k = 1; k = 4; k+)

21、 if(i != k & j != k) num = i + j * 10 + k * 100; System.out.println(num);count+; System.out.println( 符合要求的三位数共有 + count + 个); 【程序 12】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于 10 万元,低于 20 万元时,低于10 万元的部分按 10%提成,高于 10 万元的部分, 可提成 7.5% ; 20 万到 40 万之间时, 高于 20 万元的部分,可提成5%; 40 万到 60 万之间时高于40 万元的部分,可提成3%

22、; 60 万到 100 万之间时,高于60 万元的部分,可提成1.5%,高于100 万元时,超过 100 万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?分析:我可以说这是一个数学题么?分好区间用条件运算符if else 就能解决,跟程序5 类似。 (代码略,相信你可以)【程序13】题目: 一个整数, 它加上 100 后是一个完全平方数, 再加上 168 又是一个完全平方数, 请问该数是多少?分析:一个整数i,加上100是一个数j的平方,再加上168又是一个数 k的平方,所以 用三层循环可以解决问题package logic; public class FundNum publi

23、c static void main(String args) long i, j, k; for(i = 1; i 100000; i +) for(j = 0; j 1000; j+) if(j * j = i + 100) for(k = j; k 2)&isLeap(year) System.out.printf( 这天是这年第%d 天。 , sum + day + 1); elseSystem.out.printf( 这天是这年第 %d 天。 , sum + day); private static boolean isLeap(int year) if(year % 100 !=

24、0)&(year % 4 = 0) | (year % 400 = 0) return true; else return false; 【程序 15】题目:输入三个整数x,y,z,请把这三个数由小到大输出。分析:可以用条件循环,也可以用排序 算法(插入排序、冒泡排序、选择排序等) 条件循环package logic; import java.util.Scanner; public class MinOfThree public static void main(String args) Scanner in = new Scanner(System.in); System.out.prin

25、tln( 请输入三个整数); System.out.println( 请输入第 1 个整数 ); int a = in.nextInt(); System.out.println( 请输入第2 个整数 ); int b = in.nextInt(); System.out.println( 请输入第 3 个整数 ); int c = in.nextInt();System.out.print( 从小到大的顺序为: ); if(a b) if(b c) System.out.printf(%d%d%d, a, b, c); else if(a c) System.out.printf(%d%d%

26、d, a, c, b); else System.out.printf(%d%d%d, c, a, b); else if(c b) System.out.printf(%d%d%d, c, b, a); else if(c a) System.out.printf(%d%d%d, b, c, a); else System.out.printf(%d%d%d, b, a, c); 排序算法参考 java 里的 4 种排序算法【程序16】题目:输出 9*9 口诀。分析:二层循环搞定package logic; public class JiujiuBiao public static void

27、 main(String args) for (int i = 1; i 10;i+) for (int j = 1; j = i; j+) int total = 0; total = i * j; System.out.printf(%d * %d = %-5d, j, i, total); System.out.println(); 【程序17】题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下 的一半零一个。 到第 10 天早上想再吃时, 见只剩下一个桃子了。求第一天共摘了多少。

28、分析:用逆思维推推就明白了。第 10 天有一个桃子,第9 天有 3 个,第 8 天有 7 个, package logic; public class EatPeach public static void main(String args) int total = 1; /day= 1 的时候,算出来的 total 其实是第 9 天有的桃子/day = 9 的时候,算出来的 total 就是第1 天的桃子 for(int day = 1; day 10; day+) total = 2 * (total + 1); System.out.println( 一开 始共有 + total + 桃

29、子 ); 【程序 18】题目:两个乒乓球队进行比赛,各出三人。甲队为 a,b,c三人,乙队为x,y,z三人。已抽签决 定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比, c 说他不和 x,z 比,请编程序找出三队赛手的名单。分析:答案很简单,可用程序却感觉不怎么好表达、实现。我还是参考了网上的代码package logic; public class MatchCP public static void main(String args) char i, j, k; /i,j,k 分 别是 a,b,c 的对手 for(i = 'X' i = 'Z' i

30、+) for(j = 'X' j = 'Z' j+) if(i != j) for(k = 'X' k 'Z' k+) if(i != k & j != k) if(i != 'X' & k != 'X' & k != 'Z') System.out.printf(a - %cnb - %cnc - %c, i, j, k); 【程序 19】题目:打印出如下图案(菱形)*分析:主要就是控制格式,先输出上半部分,再输出下半部分package logic; public class Pr

31、ismatic public static void main(String args) for(int i = 0; i 4;i+) /1 到 4 行 for(int j = 1; j = (6 - 2 * i) / 2; j+)/ 每行前面的空格数 System.out.print(); for(int k = 1; k = 2 * i + 1; k+) System.out.print(*); / 每行的 * 号 System.out.println();/ 换行 / 下半部分 for(int i = 0; i 3; i+) for(int j = 0; j i + 1; j+) Sys

32、tem.out.print(); for(int k = 0; k 5 - 2 * i; k+) System.out.print(*); System.out.println(); 【程序 20】题目:有一分数序列: 2/1 , 3/2, 5/3, 8/5, 13/8, 21/13.求出这个数列的前20 项之和。分析:相信大家不难找出规律,实现也不难package logic; public class FractionSum public static void main(String args) float i = 2.0f, j = 1.0f; /i 为分子, j 为分母 float

33、num = 2.0f; /num 是分数, sum 是分数的和float sum = 2.0f;for(int m = 1; m 20; m+) /m = 1 时, num 已经是第 2 个加数了,所以 m 20 i = i + j; j = i - j; / 变化前的 i 赋值给 j num = i / j; sum += num; System.out.println( 前 20 个分数的和为 + sum); 【程序 21】题目:求1+2!+3!+.+20! 的和。分析:联想到 1 100 的和,只不过每个加数是相应数的阶乘package logic; import java.util.S

34、canner; public class Recursion public static void main(String args) Scanner in = new Scanner(System.in); System.out.println( 你想计算到哪个数的阶乘的和); int num = in.nextInt(); long temp = 0L; long sum = 0L; for(int i = 1; i 1) return num * recursion(num - 1); return 1; 【程序 22】题目:利用递归方法求5! 。分析:参考上题程序21 的代码里的计算阶

35、乘的方法(代码略)【程序23】题目:有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人, 说比第一个人大两岁。 最后问第一个人,他说是10 岁。请问第五个人多大?分析:这题与程序17 有异曲同工之妙,倒过来分析就简单了。 (代码略)【程序24】题目:给一个不多于5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。分析:又是拆数字游戏package logic; import java.util.Scanner; public class ReversedNum p

36、ublic static void main(String args) Scanner in = new Scanner(System.in); System.out.println( 请输入一个不多于 5 位的整数 ); int num = in.nextInt(); int n = 1; System.out.print( 这个数的逆序为: ); while(num / 10 0) n+; int tmp = num % 10; System.out.print(tmp); num /= 10; System.out.println(num); System.out.println( 这个

37、数共有 + n + 位数 ); 【程序25】题目:一个5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。分析:能把一个数的各个位上的数拆出来就简单了。参考程序3(代码略)【程序26】题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。分析:你首先要知道星期一到星期天的英文单词,然后就是用 switch 了package logic; import java.util.Scanner; public class WeekDay public static void main(String args) Scanner i

38、n = new Scanner(System.in); char firstletter, secondletter; / 存 放 第 一 第 二 个 字 母 System.out.println( 请 输 入 第 一 字 母 ); String letter = in.next(); firstletter = letter.charAt(0); switch(firstletter) case 'm':case 'M':System.out.println( 是 星 期 一 );break; case 'w': case 'W'

39、;: System.out.println(是星期三);break;case'f':case'F':System.out.println(是星期五);break;case't':case'T':System.out.println( 仅由该字母无法判断出星期几,请输入第二个字母); letter = in.next();secondletter = letter.charAt(0); if(secondletter = 'u'| secondletter ='U') System.out.print

40、ln( 是星期二 ); break; else if(secondletter = 'h' | secondletter ='H') System.out.println( 是 星 期 四 );break; else System.out.println( 输 入 错 误 ); case 's': case 'S': System.out.println( 仅由该字母无法判断出星期几,请输入第二个字母); letter = in.next();secondletter = letter.charAt(0); if(secondle

41、tter = 'a'| secondletter ='A') System.out.println( 是星期六 ); break; else if(secondletter = 'u' | secondletter ='U') System.out.println( 是 星 期 天 );break; else System.out.println( 输入错误 ); 【程序 27】题目:求 100 之内的素数分析:参考程序229】题目:对 10 个数进行排序分析:有多种方法,参考java 里的 4 种排序算法【程序 29】题目:求一

42、个3*3 矩阵对角线元素之和分析:用二维数组,难度不大package logic; import java.util.Scanner; public class MatrixSum public static void main(String args) Scanner in = new Scanner(System.in); / 输入数据 int mat = new int33; for(int i = 1; i = 3; i+) for(int j = 1; j = 3; j+) System.out.println( 请输入第 + i + 行 第 + j + 列的整数 ); mati -

43、1j - 1 = in.nextInt(); / 显示数据 for(int i = 0; i 3; i+) for(int j = 0; j 3; j+) System.out.printf(%dt,matij); / t 是 制 表 符 System.out.println(); / 计算对角线元素和 / 从左上至右下的数归为主对角线, 从左下至右上的数归为副对角线。 int sum1 = mat00 + mat11 + mat22; int sum2 = mat20 + mat11 + mat02; System.out.println( 主对角线上元素和为 + sum1); System

44、.out.println( 副对角线上元素和为 + sum2); 【程序30】题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 分析:类似插入排序,也还有其他方法 package logic; import java.util.Scanner; public class InsertNum public static void main(String args) Scanner in = new Scanner(System.in); int ary = 10, 15, 20, 25, 30, 35, 40, 45, 50; int changedAry = new

45、 intary.length + 1; System.out.print( 初始数组: ); for(int i = 0; i ary.length; i+) changedAryi = aryi; System.out.print(aryi + ); System.out.println(); System.out.println( 请输入一个整数); int num = in.nextInt(); System.out.print( 插入数字后的数组: ); insort(changedAry, num); private static void insort(int changedAry

46、, int num) / TODO Auto-generated method stub for(int i = 0; i changedAry.length; i+) if(num i;j-) changedAryj = changedAryj - 1; / 待插入位置及以后的数后退一个位置 changedAryi = num; break; if(num changedArychangedAry.length - 1)/ 待 插 入 数 大 于 所 有 数changedArychangedAry.length - 1 = num; for(int k = 0; k changedAry.l

47、ength; k+) System.out.print(changedAryk + ); 【程序 31】题目:将一个数组逆序输出。分析:输出数组时从大下标开始就可以了package logic; public class ReversedArray public static void main(String args) / 这里直接初始化一个数组 int ary = 1, 2, 3, 4, 5, 6, 7, 8, 9; / String ary = i, love, you;/ 字 符(串)数组也可以 System.out.print( 数组初始顺序为: ); for(int i = 0;

48、i = 0; i-) System.out.print(aryi + ); System.out.println(); 【程序 32】题目:取一个整数a从右端开始的47位。分析:如果可以把这个整数转换为一个字符串就好解决了package logic; import java.util.Scanner; public class SumR47 public static void main(String args) Scanner in = new Scanner(System.in); System.out.println( 请输入一个大于等于7 位的整数 ); long sum = in.n

49、extLong(); Long sum1 = new Long(sum);/Long 是 long 的包装类String sum2 = sum1.toString(); System.out.println(sum2.substring(sum2.length() - 7, sum2.length() - 3); / substring 截取两参数间的字符串 【程序 33】题目:打印出杨辉三角形(要求打印出 10 行如下图) 11 12 2 13 3 3 11 4 6 4 11 5 10 10 5 1分析:用二维数组控制一下格式就可以了,先把所有的 1 放到合适的位置,再放有规律的数,最后输出时控制格式package logic; public class

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论