赞
踩
【程序 1】
题目: 古典问题: 有一对兔子, 从出生后第 3 个月 起每个月 都生一对兔子, 小兔子长到第三个月 后每个月 又生一对兔子, 假如兔子都不死, 问每个月 的兔子对数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8, 13, 21.... 做这种题目, 最好的做法就是找出规律, 跟高中的数列一样
本题有: a[n]=a[n-1]+a[n-1],而第一第二项都知道了, 后面的值也可以求得
- public class Programme1 {
- public static void main(String[] args) {
- System. out.print("请输入你想知道的兔子数量的月 份: ");
- Scanner scanner=new Scanner(System.in);
- int n=scanner.nextInt();//获取输入的整数
- System. out.println("第"+n+"个月 兔子总数为"+fun(n));
- scanner.close();
- }
- //求得所需月 份的兔子的数量, 返回值为兔子的数量
- private static int fun(int n){
- if(n==1 | | n==2)
- return 1;
- else
- return fun(n-1)+fun(n-2);
- }
- }
【程序 2】
题目: 判断 101-200 之间有多少个素数, 并输出所有素数。
程序分析:
* 素数是: 只能被1或本身整除的数, 如: 3, 5, 7, 11, 131. . .
*判断素数的方法: 用一个数分别去除2到sqrt(这个数) ,
*其实用这个数分别去除2到他本身少1的数也可以, 但是运算时间增加了
*如果能被整除, 则表明此数不是素数, 反之是素数。
- public class Programme2 {
- public static void main(String[] args) {
- int sum=0;
- for (int i = 100; i < 200; i++) {
- if (IsRightNum(i)) { //判断这个数是不是素数
- System. out.print(i+" ");
- sum++;
- if (sum%10==0) { //十个一行
- System. out.println();
- }
- }
- }
- System.out.println("素数的整数: "+sum);
- }
- //判断这个数是不是素数的具体代码
- private static boolean IsRightNum(int i) {
- for (int j = 2; j < Math.sqrt(i); j++) {
- if (i%j==0) { //如果能整除, 就说明不是素数, 可以马上中断, 继续对
- 下一个数判断
- return false;
- }
- }
- return true;
- }
- }
【程序 3】
题目: 打印出所有的"水仙花数", 所谓"水仙花数"是指一个三位数, 其各位数字立方和等于该数本身。
例如: 153 是一个"水仙花数", 因为 153=1 的三次方+5 的三次方+3 的三次方。
程序分析: 利用 for 循环控制 100-999 个数, 每个数分解出个位, 十位, 百位。
- public class Programme3 {
- public static void main(String[] args) {
- int sum=0;//水仙花的总数
- for (int i = 100; i < 1000; i++) {
- int bite=i%10; //求得个位
- int ten=i/10%10; //求得十位
- int hundred=i/100;//求得百位
- //如果符合水仙花条件的数打印出来
- if (i==(bite*bite*bite)+
- (ten*ten*ten)+(hundred*hundred*hundred)) {
- System. out.print(i+" ");
- sum++;
- }
- }
- System. out.println("总共有水仙花个数: "+sum);
- }
- }
【程序 4】
题目: 将一个正整数分解质因数。 例如: 输入 90, 打印出 90=2*3*3*5。
程序分析: 对 n 进行分解质因数, 应先找到一个最小的质数 k, 然后按下述步骤完成:
(1) 如果这个质数恰等于 n, 则说明分解质因数的过程已经结束, 打印出即可。
(2) 如果 n<>k, 但 n 能被 k 整除, 则应打印出 k 的值, 并用 n 除以 k 的商, 作为新的正整数 n, 重复执行第一 步。
(3) 如果 n 不能被 k 整除, 则用 k+1 作为 k 的值, 重复执行第一步。
- public class Programme4 {
- public static void main(String[] args) {
- System. out.print("请输入一个你要分解的正整数: ");
- Scanner scanner=new Scanner(System.in);
- int input=scanner.nextInt();//获取输入的数字
- System. out.println();
- System. out.print(input+"=");
- for (int i = 2; i < input+1; i++) {
- while(input%i==0&&input! =i) {
- input=input/i;
- System. out.print(i+"*");
- }
- if(input==i){ //上面的都不能整除, 说明这是一个质数
- System. out.print(i);
- break;
- }
- }
- scanner.close();
- }
- }
【程序 5】
题目: 利用条件运算符的嵌套来完成此题: 学习成绩>=90 分的同学用 A 表示, 60-89 分之间的用 B 表示, 60 分以下的用 C 表示。
程序分析: (a>b) ?a: b 这是条件运算符的基本例子。
- public class Programme5 {
- public static void main(String[] args) {
- System. out.println("请输入你的分数: ");
- Scanner scanner=new Scanner(System.in);
- int input=scanner.nextInt();//获取输入
- //等级判断
- String belong=input>=90?"A":(input>=60?"B":"c");
- System. out.println(input+"分属于: "+belong);
- scanner.close();
- }
- }
【程序 6】
题目: 输入两个正整数 m 和 n, 求其最大公约数和最小公倍数。
程序分析: 利用辗除法。
*这里有一个知识点要记住的, 最大公约数和最小公倍数的求法
*1、 先求最大公约数bigDivisor
*2、 就可以很方便获得最小公倍数multiple=input1*input2/bigDIvisor
*这里最重要的就是求最大公约数: 求法如下
*(1)用大的数对小的数求余
*(2)把小的数赋值给大的数, 把求余获得的结果赋值给小的数,
*(3)循环上一步的操作, 直到求余的结果为零
*(4)上一步被求余的数就是我们要的最大公约数, 不信的话, 你可以动手试试
- public class Programme6 {
- public static void main(String[] args) {
- int bigDivisor=0;//定义最大公约数
- int multiple=0;//定义最小公倍数
- System. out.println("请输入两个整数: ");
- Scanner scanner = new Scanner(System.in);
- int input1 = scanner.nextInt();// 获取第一个数
- int input2 = scanner.nextInt();// 获取第二个数
- multiple=input1*input2;//这个值保存, 求公约数后, 方便求得最小公倍数
- int temp =1;// 交换用的中间数
- if (input2 > input1) {//确保第一个数不小于第二个数
- temp=input1;
- input1=input2;
- input2=temp;
- }
- while (temp! =0) { //求余结果不等于零, 就一直循环
- temp=input1%input2;//求余结果
- input1=input2;//大的数已经没用了, 用小的数替代
- input2=temp;//把求余的结果赋值给小的数
- }
- bigDivisor=input1;//最后一次求余结果为零时, 被求余的数
- multiple=multiple/bigDivisor;
- System. out.println("最大公约数是: "+bigDivisor );
- System. out.println("最小公倍数是: "+multiple);
- scanner.close();
- }
- }
【程序 7】
题目: 输入一行字符, 分别统计出其英文字母、 空格、 数字和其它字符的个数。
程序分析:
这里的需要的知识点:
1、 获取一行字符串, nextLine()
2、 把字符串的每一个字符赋值到一个数值中
3、 对比每一个数值在ASK码的范围, 就可以确定它符号的类别
4、 char字符ASK码的范围
(1) 数字0到9: 48~57
(2) 字母A到Z: 65到90 a到z: 97到122
(3) 空格是 32
- public class Programme7 {
- public static void main(String[] args) {
- int num=0;//数字的个数
- int letter=0;//字母的个数
- int space=0;//空格的个数
- int others=0;//其他的个数
- System. out.println("请输入一串字符: ");
- Scanner scanner=new Scanner(System.in);
- String string=scanner.nextLine();//获取一行字符串
- //把字符串里面的值赋值给一个字符型数组
- char[] arr=string.toCharArray();
- //遍历字符串里面的所有值
- for (int i = 0; i < arr.length; i++) {
- if (arr[i]>=48&&arr[i]<=57) {//字符是数字
- num++;
- } else if((arr[i]>=65&&arr[i]<=90)| | (arr[i]>=97&&arr[i]<=122)) {
- letter++;
- }else if (arr[i]==32) {
- space++;
- }else {
- others++;
- }
- }
- System. out.println("数字: "+num+"个, 字母: "+letter+"个, 空格:"+space+"个, 其他: "+others+"个");
- scanner.close();
- }
- }
【程序 8】
题目: 求 s=a+aa+aaa+aaaa+aa. . . a 的值, 其中 a 是一个数字。 例如 2+22+222+2222+22222(此时共有 5 个
数相加) , 几个数相加有键盘控制。 输出结果的形式如: 2+22+222=246;
程序分析: 关键是计算出每一项的值。
比如获取的数字为: a, 出现的项数为: n
总结一下, 可以得到一下规律:
1、 第一项有一个a, 最后一项有n个a
2、 第 1 和第 2 项相差 2*10, 第 2 和第三项相差 2*100, 第 k 和第 k+1 项相差 2*(10 的 k 次方)
- public class Programme8 {
- public static void main(String[] args) {
- int n=0,a=0;
- Scanner scanner=new Scanner(System.in);
- System. out.println("请输入a的值: ");
- a=scanner. nextInt();
- System. out.println("请输入n的值: ");
- n=scanner. nextInt();
- int[] arr=new int[n];//创建数组长度为输入的项数
- int i=1;//while循环初始化的值
- arr[0]=a;//数组的第一个值为3
- //把每一项的值赋值给数组里面的数
- while (i<n) {
- a*=10;
- arr[i]=a+arr[i-1];
- i++;
- }
- //求和
- int sum=0;
- for(int s: arr){
- sum+=s;//累加求和
- if (s==arr[n-1]) {
- System. out.print(s);
- break;//最后一次只输出结果
- }
- System. out.print(s+"+");//前面的值输出结果, 后面还要加一个加号
- }
- System. out.println("="+sum);//完美结束
- }
- }
【程序 9】
题目: 一个数如果恰好等于它的因子之和, 这个数就称为"完数"。 例如 6=1+2+3. 编程找出 1000 以内的
所有完数。
判断完数的方法:
* 利用for循环判断所有因数的和是否和输入的值是否相等, 相等的话输出
* 求因数的方法:
* (1) 两个嵌套循环, 并用i%j==0, 关于i和j的值范围: i从1到1000逐个遍历, j只需不大于i/2+1 即可。比如: 48, 最大的因数才24, 99最大的因数是33, 因数不会大于本身数的一半
* (2) j就是我们所求的因数, 把所有的j相加, 就可以得到因数总和
* (3) 因数总和已经包含 1 了, 因为第一次就保存 1 了
- public class Programme9 {
- public static void main(String[] args) {
- System. out.println("1000以内的因数有: ");
- for (int i = 1; i <=1000; i++) {
- int sum=0;//所有因数的总和
- for (int j = 1; j < i/2+1; j++) {
- if (i%j==0) { //判断范围内的所有j相加, 就是因数总和
- sum=sum+j;
- if (i==sum) {
- System. out.print(i+" ");
- }
- }
- }
- }
- }
- }
【程序 10】
题目: 一球从h米高度自由落下, 每次落地后反跳回原高度的一半;
再落下, 求它在 第n次落地时, 共经过多少米? 第n次反弹多高?
程序分析: 反弹的高度: (1/2) 的n次方*h
* 经过的距离: 这个可以总结得到: 第一次落地经过: h, 第二次落地经过: h+(h/2) *2,
* 第三次落地经过: h+(h/2) *2+(h/2/2) *2
* 那么第 n 次落地经过: h+(h/2) *2+(h/2/2) *2 +. . . +h/(2 的 n-1 次方) *2
pub
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。