Java循环结构

一、求非负数之和

本关任务:使用 Scanner 对象接收一组数据,每组数据包含 4 个整数,其中有正有负,比如:22 33 -22 32。请使用 while 循环求出每组数据的非负数之和(每组数据之间用空格分开,而组与组之间用换行符分开)。

import java.util.Scanner;

public class MyWhile {

	public static void main(String[] args) {
		// 定义变量sum,用于求非负数的和,并赋初值0。
		int sum = 0;
		// 定义变量i,用于控制循环,并赋初值1。
		int i = 1;
		// 定义Scanner对象
		Scanner input = new Scanner(System.in);
		// 请在 Begin-End 间编写代码

		/********** Begin **********/
		// 第一步:定义while循环,循环4次
		while (i < 5) {
			// 第二步:获取输入值
			int a = input.nextInt();
			// 第三步:判断输入值是否大于0,对大于0的值累加
			if (a < 0) {
			} else {
				sum += a;
			}

			// 第四步:while循环中的变量加1
			i++;
			
		}
		// 第五步:打印sum值
		System.out.println(sum);
		/********** End **********/

	}
}

二、等差数列均值

本关任务:使用 Scanner 对象获取一组等差整数(键盘输入的数之间用空格分隔,最后一个为 %,不计入计算),统计出等差数列的均值(保留两位小数)。

/*
任务:接收输入值(整数数列),统计出等差数列的均值,每组输入以%结束,比如1 3 5 %。
其中百分号的作用是:在while循环中判断输入为%时,终止循环。

*/

import java.util.Scanner;

public class WhileTest {

	public static void main(String[] args) {
		// 定义变量sum,用于求等差数列的和
		int sum = 0;
		// 定义变量z,记录等差数个数
		int z = 0;
		// 创建Scanner对象
		Scanner input = new Scanner(System.in);
		// 请在 Begin-End 间编写代码
		/********** Begin **********/
		// 第一步:使用while循环接收Scanner对象接收的值,当下一个值等于%时,终止循环

		String s = input.nextLine();
		String[] a = s.split(" ");
		for (String b : a) {
			if (b.equals("%")) {
				break;
			}
			// 第二步:获取输入值
			else {
				int x = Integer.parseInt(b);
				// 第三步:对输入的数列值求和
				sum += x;
				// 第四步:统计数列个数
				z++;
			}
		}
		// 第五步:数列中值的总和,除以数列个数求出均值(保留两位小数)
		
		System.out.printf("%.2f", (double)sum/z);
		/********** End **********/

	}
}

三、前n个自然数平均值

本关任务:给定一个大于 1 的正整数 n,求所有小于 n 的自然数的平均值(保留两位小数)。 自然数的定义:大于等于 0 的整数。

/*
任务:通过Scanner对象获取输入值n,求所有小于n的自然数的平均值。
输出的平均值请转化为double类型。
*/

import java.util.Scanner;

public class DWhileTest {
	public static void main(String[] args) {
		// 定义变量n,接收输入值
		int n;
		// 定义求和变量sum,并赋初值0
		int sum = 0;
		// 定义变量i,并赋初值0
		int i = 0;

		// 创建Scanner对象
		Scanner input = new Scanner(System.in);
		// 请在Begin-End间编写代码
		/********** Begin **********/

		// 获取输入值n
		n = input.nextInt();
		do {
			sum+=i;
			i++;
		}
		// 在while后判断条件,当i不小于n时退出循环
		while (i < n);

		// 输出平均值,保留两位小数
		System.out.printf("%.2f\n",(double)sum/i);
		/********** End **********/

	}
}

四、正负数数量统计

本关任务:循环获取给定值(整数),判断给定值的正数个数和负数个数(键盘输入的数值之间用空格分隔,最后输入的是一个 % 字符,当获取到这个字符时,跳出循环)。

输出格式:正数个数为:xx。负数个数为:xx

/*
任务:统计给定一列数的正数和负数个数
给定的数举例:-1 2 3 -4 %
其中%用于while中,判断输入结束
*/

import java.util.Scanner;

public class DWhile {
	public static void main(String[] args) {
		// 定义变量positive,并赋初值0,用于统计正数个数
		int positive = 0;
		// 定义变量negative,并赋初值0,用于统计负数个数
		int negative = 0;

		// 创建Scanner对象
		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		String[] a = str.split("\\s+");
		//\\s+是一个正则表达式,它匹配一个或多个空格
		for (String s : a) {
			if (s.equals("%")) {
				break;
			} 
			else {
				int x = Integer.parseInt(s);
				if (x > 0) {
					positive++;
				} else if (x < 0) {
					negative++;
				}
			}
		}
		// 谁还使用do···while啊
		// 在do后的花括号中编写循环语句
		// do{
		// 请在 Begin-End 间编写代码
		/********** Begin **********/
		// 第一步: 获取输入值

		// 第二步:判断输入值是否为正数,如果是,把正数个数变量positive加1

		// 第三步:判断输入值是否为负数,如果是,把负数个数变量negative加1

		// }
		// 第四步:在while后判断条件,当输入值的下一个值为%时,终止循环
		// while();
		// 第五步:输出正数和复数个数,具体格式见预期输出
		System.out.println("正数个数为:"+positive+"。负数个数为:"+negative);
		/********** End **********/

	}
}

五、求水仙花数

本关任务:输出所有水仙花数。 水仙花数特征:

  • 该值处于 100(包括)到 999(包括)之间;
  • 其个位数的三次幂,十位数的三次幂,百位数的三次幂的和等于这个数本身。

输出格式:xx是一个水仙花数。

/*
* 任务:使用for循环输出所有的水仙花数
*水仙花数特征:
  - 该值处于 100(包括)到 999(包括)之间;
  - 其个位数的三次幂,十位数的三次幂,百位数的三次幂的和等于这个数本身。
* 输出样式:x是一个水仙花数。
*/

public class ForTest {
	public static void main(String[] args) {

		// 请在 Begin-End 间编写代码

		/********** Begin **********/
		// 第一步:使用for循环依次取999到100中的每个数,判断是否为水仙花数
		for(int i = 999;i > 99;i--) {
		// 第二步:获取个位
			int g = i%10;
		// 第三步:获取十位
			int s = (i/10)%10;
		// 第四步:获取百位
			int b = (i/100);
		// 第五步:判断个位数的三次幂,十位数的三次幂,百位数的三次幂的和是否等于这个数本身,等于的话,输出该数
			if(i == (g*g*g+s*s*s+b*b*b)) {
				System.out.println(i+"是一个水仙花数。");
			}
		}	
		/********** End **********/

	}
}

六、求完数

本关任务:判断给定的一个整数是否是完数。

完数的定义:一个数如果恰好等于它的因子之和(本身除外),这个数就称为完数。例如数字 6,其因子为 1,2,3,6(本身除外),满足1+2+3=6,所以 6 是完数。

/*
任务:接收一个整数,判断该数是否是完数。
完数的定义:一个数如果恰好等于它的因子之和(本身除外),这个数就称为完数。
例如数字6,其因子为1,2,3,6(本身除外),满足1+2+3=6,所以这个数为完数。
如果是完数,请输出:x是完数
如果不是完数,请输出:x不是完数
具体输出样式见预期输出。
*/

import java.util.Scanner;

public class ForTest {
	public static void main(String[] args) {
		// 定义变量sum,用于求因子的和,并赋初值为0
		int sum = 0;
		// 创建Scanner对象
		Scanner input = new Scanner(System.in);
		// 获取输入值
		int x = input.nextInt();
		// 请在 Begin-End 间编写代码

		/********** Begin **********/
		// 第一步:使用for循环判断获取的整数是否为完数
		for(int i = 1;i < x;i++) {
			if(x%i == 0) {
				sum+=i;
			}
		}
		// 第二步:如果是完数,请输出x是完数
		if(sum == x) {
			System.out.println(x+"是完数");
		}
		// 第三步:如果不是,请输出x不是完数
		if(sum != x) {
			System.out.println(x+"不是完数");
		}
		/********** End **********/

	}
}

七、continue

本关任务:给定一个正整数 n,统计比 n 小的正奇数的个数。

输出格式:n前面共有xx个奇数。

/*
任务:使用Scanner对象接收给定的一个整数,统计小于该整数的正奇数个数。
输出格式:5前面共有2个奇数。
*/
import java.util.Scanner;

public class  ContinueTest {
    public static void main(String[] args) {
        
        // 定义变量count,用于统计奇数个数,并赋初值为0。
        int count = 0;
        // 创建Scanner对象
        Scanner sc = new Scanner(System.in);
        // 获取输入值
        int n = sc.nextInt();
        // 请在Begin-End间编写代码
        /********** Begin **********/
        // 第一步:编写for循环从1到n之间循环取数
        for(int i = 1;i < n;i++) {
        // 第二步:判断是否为偶数,如果是,跳出本次循环,如果不是,对奇数个数变量值加1
        	if(i % 2 != 0) {
        		count +=1;
        	}
        }
        // 第三步:循环结束,输出总的奇数个数
        System.out.printf("%d前面共有%d个奇数。",n,count);
        /********** End **********/

    }
}

八、比赛名单判断

本关任务:两个乒乓球队进行比赛,各出 3 人。甲队为 a、b、c,乙队为 x、y、z。有人向队员打听比赛的名单,a 说他不是和 x 比,c 说他不是和 x、z 比。

/*
任务:求出对战人信息。
输出样式:a的对手x
两个乒乓球队进行比赛,各出 3 人。
甲队为 a、b、c,乙队为 x、y、z。
有人向队员打听比赛的名单,a 说他不是和 x 比,c 说他不是和 x、z 比。
*/

public class TeamMate {
	public static void main(String[] args) {
		// 请在Begin-End间编写代码
		/********** Begin **********/
		// 第一步:使用循环求出与c的对战的人
		for (char c = 'x'; c <= 'z'; c++) {
			if (c != 'x' && c != 'z') {
				// 第二步:使用循环求出与a的对战的人
				for (char a = 'x'; a <= 'z'; a++) {
					if (a != 'x' && a != c) {
						// 第三步:使用循环求出与b对战的人
						char b;
						for (b = 'x'; b <= 'z'; b++) {
							if (b != a && b != c) {
								break;
							}
						}
						// 第四步:打印对战信息
						System.out.println("a的对手" + a);
						System.out.println("b的对手" + b);
						System.out.println("c的对手" + c);
					}
				}
			}
		}
		/********** End **********/
	}
}

九、住房贷款还款计算

本关任务:编写一个程序,由用户输入住房贷款和贷款年限,程序输出不同利率下的月还款额和总还款额,利率从 5%~8%,增长间隔为 1/8。例如,如果输入贷款额 10000 元人民币,贷款期限 5 年,程序应输出如下内容:

 
  1. 贷款金额: 10000
  2. 贷款年限: 5
  3. 利率 月还款额 总还款额
  4. 5.000% 188.71 11322.74
  5. 5.125% 189.28 11357.13
  6. ……
  7. 8.000% 202.76 12165.83

注意:贷款金额、贷款年限和结果之间用英文冒号和一个空格分隔;利率、月还款额和总还款额之前用 4 个空格分隔。

 

import java.util.Scanner;

/*
 * 任务:编写一个程序,由用户输入住房贷款和贷款年限,程序输出不同利率下的月还款额和总还款额,利率从 5%~8%,
 * 增长间隔为 1/8。 例如,如果输入贷款额
 * 10000 元人民币,贷款期限 5 年,程序应输出如下内容:
 * 
 * 贷款金额: 10000 贷款年限: 5 利率 月还款额 总还款额 
 * 							5.000% 188.71 11322.74 
 *							5.125% 189.2811357.13 
 * 									…… 
 * 							8.000% 202.76 12165.83
 * 
 * 利率请保留3位小数,月还款额和总还款额请保留2位小数。 利率和月还款额以及总还款额之间保留4个空格。
 * 
 * 
 * 思路:获取住房贷款以及贷款年限,计算不同利率下的月还款额以及总还款额。
 * 
 * 
 */

// 请在Begin-End间编写完整代码,类名请使用LoanTest
/********** Begin **********/
// 导入 Scanner 类

// 定义公开类  LoanTest
public class LoanTest{
// 定义主方法 main,在该方法中完成本关任务
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        double loanAmount = scanner.nextDouble();
        int years = scanner.nextInt();
        System.out.printf("贷款额:%.0f\n",loanAmount);
        System.out.println("贷款年限:"+years);
        System.out.println("利率    月还款额    总还款额");
        for (double rate = 5.0; rate <= 8.0; rate += 0.125) {
            double monthlyInterestRate = rate / 1200;
            double monthlyPayment = loanAmount * monthlyInterestRate / (1 - 1 / Math.pow(1 + monthlyInterestRate, years * 12));
            double totalPayment = monthlyPayment * years * 12;
            System.out.printf("%.3f%%\t%.2f\t%.2f\n", rate, monthlyPayment, totalPayment);
        }
	}
}
/********** End **********/

十、杨辉三角形

本关任务:给定一个正整数 n,打印出有 n 行的杨辉三角形。

杨辉三角形的特征:

  • 第 n 行有 n 个数字;
  • 每一行的开始和结尾数字都为 1;
  • 从第 3 行起,除去每一行的开始和结尾数字,其余每个数都满足以下条件:任意一个数等于上一行同列和上一行前一列的和,如以下杨辉三角形中第 3 行第 2 列中的 2 等于它上一行同列(第 2 行第 2 列中的 1)和上一行前一列(第 2 行第 1 列中的 1)的和。
import java.util.Scanner;

/*
* 任务:从控制台获取输入的正整数n,打印带有n行的杨辉三角形
* 每个数字保证最少4个宽度,每行前面保证2n个宽度
杨辉三角形的特点:
- 第 n 行有 n 个数字;
- 每一行的开始和结尾数字都为 1;
- 从第 3 行起,除去每一行的开始和结尾数字,其余每个数都满足以下条件:
任意一个数等于上一行同列和上一行前一列的和,
如以下杨辉三角形中第 3 行第 2 列中的 2 等于它上一行同列(第 2 行第 2 列中的 1)
和上一行前一列(第 2 行第 1 列中的 1)的和。
以下是有5行的杨辉三角形:
             1
           1   1
         1   2   1
       1   3   3   1
     1   4   6   4   1
*/

// 请在Begin-End间编写代码
/********** Begin **********/
// 导入 Scanner 类

// 定义公开类 Test
public class Test {
	// 定义主方法 main,在该方法中完成本关任务
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[][] triangle = new int[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                if (j == 0 || j == i) {
                    triangle[i][j] = 1;
                } else {
                    triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
                }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - i; j++) {
                System.out.print("  ");
            }
            for (int j = 0; j <= i; j++) {
                System.out.printf("%4d", triangle[i][j]);
            }
            System.out.println();
        }
    }
}

十一、日历打印

本关任务:接收一个年份数和一个月份数,打印出该月的日历。

日历输出样式如下图1所示:

                                                                        图1

如果输入的年份小于 1900,请输出:“请输入大于或等于1900的年份”。

注意:日期之间以及星期之间使用 \t 分隔。

import java.util.Scanner;

/*
接收一个年份数(大于等于1900)和一个月份数,打印出该月的日历。
日历输出格式如下:
==================================================
日	一	二	三	四	五	六
						1	
2	3	4	5	6	7	8	
9	10	11	12	13	14	15	
16	17	18	19	20	21	22	
23	24	25	26	27	28	29	
==================================================
其中日期上下的分隔符用的是50个=。
日期之间以及星期之间使用\t分隔。
1900年1月1日是星期1。


思路分析:
求1900年到输入年份之间的累计天数,其中闰年366天,平年365天;
求1月到输入月份之间的累计天数;
得到1900-1-1到输入年月之前所有天数,用总天数对7求余,对余数加1,该数值即为该月1号的星期;
判断输入月份有多少天;
控制格式打印日历。
*/

// 请在Begin-End间编写完整代码,类名请使用Calendar
/********** Begin **********/
// 导入 Scanner 类

// 定义公开类 Calendar
public class Calendar {
	// 定义主方法 main,在该方法中完成本关任务
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int year = scanner.nextInt();
		int month = scanner.nextInt();

		if (year < 1900 ) {
			System.out.println("请输入大于或等于1900的年份");
		} 
        else if(month > 12 || month <0){
            System.out.println("请输入正确的月份");
        }
        else {
			int days = countDays(year, month);
			int dayOfWeek = (days + 1) % 7;
			int daysInMonth = getDaysInMonth(year, month);

			System.out.println("==================================================");
			System.out.println("日\t一\t二\t三\t四\t五\t六");

			for (int i = 0; i < dayOfWeek; i++) {
				System.out.print("\t");
			}

			for (int i = 1; i <= daysInMonth; i++) {
				System.out.print(i + "\t");
				if ((dayOfWeek + i) % 7 == 0) {
					System.out.println();
				}
			}

			System.out.println("\n==================================================");
		}
	}

	// 距离1900一月有多少天
	private static int countDays(int year, int month) {
		int days = 0;
		for (int i = 1900; i < year; i++) {
			days += isLeapYear(i) ? 366 : 365;
		}
		for (int i = 1; i < month; i++) {
			days += getDaysInMonth(year, i);
		}
		return days;
	}

	// 闰年or平年
	private static boolean isLeapYear(int year) {
		return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
	}

	// 相对应月份的天数
	private static int getDaysInMonth(int year, int month) {
		if (month == 2) {
			return isLeapYear(year) ? 29 : 28;
		}
		if (month == 4 || month == 6 || month == 9 || month == 11) {
			return 30;
		}
		return 31;
	}
}

/********** End **********/

 十二、哥德巴赫猜想

本关任务:验证 7-100(含 7 不含 100)之间的数是否符合哥德巴赫猜想。 哥德巴赫猜想:任一大于 6 的正整数都能分解成两个素数之和。 素数:一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。

/*本关任务:验证 7-100(含 7 不含 100)之间的数是否符合哥德巴赫猜想。
哥德巴赫猜想:任一大于 6 的正整数都能分解成两个素数之和。
素数:一个大于 1 的自然数,除了 1 和它自身外,不能被其他自然数整除的数。*/
public class GeTest {
	// 判断整数是否是素数
	public static boolean isPrime(int x) {
		for (int y = 2; y < x; y++) {
			if (x % y == 0) {
				return false;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		// 验证 7-100 之间的数符合哥德巴赫猜想
		// 请在Begin-End间编写完整代码
		/********** Begin **********/

		for(int i = 7; i < 100; i++) {
            for(int x = 2; x < (i/2)+1; x++) {
                if(isPrime(x) && isPrime(i - x)) {
                    System.out.println(i + "可分解为素数" + x + "和素数" + (i - x));
                }
            }
        }
		/********** End **********/
	}
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值