JavaSE 基础 - 第六章 控制语句【习题练习】

JavaSE 基础 - 第六章 控制语句【习题练习】

      • 【作业1】计算1000以内所有不能被7整除的整数之和?
      • 【作业2】计算 1+2-3+4-5+6-7....+100的结果
      • 【作业3】从控制台输入一个正整数,计算该数的阶乘。例如输入5,阶乘为 5 * 4 * 3 * 2 * 1
      • 【作业4】从控制台接收一个正整数,判断该数字是否为质数
      • 【作业5】 从键盘接收一个正整数,该正整数作为行数,输出以下图形
      • 【作业6】小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
      • 【作业7】一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程找出1000内所有的完数。
    • 传送门

【作业1】计算1000以内所有不能被7整除的整数之和?

解题思路:

    【重要】应该怎么去编程???????

	计算1000以内所有不能被7整除的整数之和
		1、解决一个问题的时候,可以先使用汉语描述思路。(养成好习惯)
		2、复杂的问题可以“一步一步”去实现,没必要一下全部实现。
	
	把上面的题目可以拆分成几步去完成:

		第一步:从1开始循环,循环到1000,先保证每一个数字你都能取到。

		第二步:在以上第一步的循环过程中,一个数字一个数字筛查,判断该数字是否
		是“不能被7整除的整数”。
	
	编程思想/思路,都是一步一步分析,积累出来的。
	编程最主要的是写汉语思路。思路有了,代码就不远了。

	把问题拆开,一个一个去解决一下。

	不断写代码,不断的积累编程“模型”。

代码:

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

		// 在外部准备一个变量,用来存储求和的结果
		int sum = 0;

		//循环的时候你能想起来for while do..while
		for(int i = 1; i <= 1000; i++){ //第一步

			// 判断的时候你能想起来使用if
			if(i % 7 != 0){ // 第二步
				// 此时的i是不能被7整除的,这个i应该此时纳入求和/累加。
				//sum += i;
				sum = sum + i;
			}
		}
		// 在for循环结束之后,结果才计算完成,所以在这里输出。
		System.out.println("sum = " + sum); //429429
	}
}

【作业2】计算 1+2-3+4-5+6-7…+100的结果

// 找规律:奇数时减法,偶数时加法。
// 第一种思路:(除1之外)所有的偶数求和,所有的奇数求和,然后偶数求和的结果减去奇数求和的结果。
// 第二种思路:循环过程中取出每个值,判断该数是偶数还是奇数,偶数就加,奇数就减。

//写代码养成好习惯是:写一步测试一步。
public class Homework2{
	public static void main(String[] args){
		// 第一步:先别着急着完成,先能从1取到100
		int sum = 1; //sum的初始值不是0,而是1.
		for(int i = 2; i <= 100; i++){ // i从2开始。
			if(i % 2 == 0){ //偶数
				sum += i;
			}else{ // 奇数
				sum -= i; 
			}
		}
		System.out.println("结果=" + sum); // 52
	}
}

【作业3】从控制台输入一个正整数,计算该数的阶乘。例如输入5,阶乘为 5 * 4 * 3 * 2 * 1

public class Homework3{
	public static void main(String[] args){
		//第一步:怎么从键盘上接收一个正整数。
		java.util.Scanner s = new java.util.Scanner(System.in);
		// 等待用户输入一个正整数。
		System.out.print("请输入一个正整数:");
		int num = s.nextInt();
		// 计算该数的阶乘
		// 5的阶乘:5*4*3*2*1
		// 8的阶乘:8*7*6*5*4*3*2*1
		// 第二步:先不用管乘法的事儿,先实现从8取到1.(递减的方式取)
		//int jieGuo = 0; //初始值不能是0,是0的时候,乘积最后是0.
		int jieGuo = 1; //结果的初始值给1.
		for(int i = num; i > 1; i--){
			jieGuo *= i; // jieGuo = jieGuo * i;
		}
		System.out.println("计算结果 = " + jieGuo);
	}
}

【作业4】从控制台接收一个正整数,判断该数字是否为质数

/*
质数(质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数)

因数是什么?
	3 * 5 = 15
	3和5都是15的因数。

2 3 4 5 6 7中:2 3 5 7都是质数。

重点题目:
	主要练习,在外部打布尔标记。

*/
public class Homework4{
	public static void main(String[] args){
		// 从控制台接收一个正整数。
		java.util.Scanner s = new java.util.Scanner(System.in);
		System.out.print("请输入一个正整数:");
		int num = s.nextInt(); // 假设输入的是8

		// 判断该数字是否为质数
		// 怎么判断num是不是质数
		// 怎么判断8是不是质数?
		// 思路:8除以2看看能不能整除、8除以3看看能不能整除、8除以4看看能不能整除
		// 一直除下去,直到发现有能够整除的,表示该数一定不是质数。
		/*
			假设输入的是7:
				7 / 1 不用判断
				7 / 2	需要判断
				7 / 3	需要判断
				7 / 4	需要判断(假设这个判断,发现可以整除,就没必要往下判断了。)
				7 / 5	需要判断
				7 / 6	需要判断
				7 / 7 不用判断
		*/

		//可以考虑在外边准备一个布尔类型的标记。
		boolean zhiShu = true; // true表示是质数。

		for(int i = 2; i < num; i++){ // 假设输入的是100
			//System.out.println(i);
			if(num % i == 0){
				// 循环没必要执行了,为了效率,这里要终止循环
				//System.out.println("该数字"+num+"不是质数!");
				zhiShu = false;
				break;
			}
		}

		System.out.println(num + (zhiShu ? "是" : "不是") + "质数");
	}
}

【作业5】 从键盘接收一个正整数,该正整数作为行数,输出以下图形

    *
   ***
  *****
 *******
*********
例如:输入5,则打印如上图5行。
/*
空格的规律:
	第1行4个空格(5-1)
	第2行3个空格(5-2)
	第3行2个空格(5-3)
	第4行1个空格(5-4)
	第5行0个空格(5-5)

星号的规律:
	第1行1个
	第2行3个
	第3行5个
	第4行7个
	.....

	行号 * 2 - 1
*/
public class Homework5{
	public static void main(String[] args){
		// 开发需要思路,实现这个功能需要一步一步来。
		// 这个步骤是什么?
		java.util.Scanner s = new java.util.Scanner(System.in);
		System.out.print("请输入一个正整数作为行数:");
		int rows = s.nextInt();
		
		// 6行循环6次
		// n行循环n次
		for(int i = 1; i <= rows; i++){ // 外层循环控制的是总行数。
			
			// 我在这里需要将一行全部输出
			// 这里需要再使用循环,输出空格以及“*”
			// 输出空格的循环
			for(int j = 0; j < rows - i; j++){
				System.out.print(" ");
			}
			// 输出星号*的循环
			for(int k = 0; k < i * 2 - 1; k++){
				System.out.print("*");
			}

			// 以上两个for循环都结束之后,表示一行就结束了
			// 在这里换行
			System.out.println();
		}

	}
}

【作业6】小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。

/*
这个题目最主要练习是:
	while循环 + 计数。
*/
public class Homework6{
	public static void main(String[] args){

		// 小芳每一天肯定会有2.5元的收入。
		// 小芳即使有一天花了6元,但是2.5元的收入还是有的。
		// 经过分析:总钱数肯定需要是double类型。int类型不行。

		int day = 0; // 天数的默认初始值是0
		double money = 0.0; // 钱的默认初始值是0

		/*
		while(true){
			day++; // 天数加1
			money += 2.5; // 钱加2.5元
			// 如果天数是5的倍数,那么花去6元
			if(day % 5 == 0){
				money -= 6.0;
			}
			// 什么时候循环结束呢?
			// 当money >= 100.0的时候,循环结束。
			if(money >= 100){
				break;
			}
		}
		*/

		// 改造之后的。
		while(money < 100){
			day++; // 天数加1
			money += 2.5; // 钱加2.5元
			// 如果天数是5的倍数,那么花去6元
			if(day % 5 == 0){
				money -= 6.0;
			}
		}

		//小芳通过74天存到了101.0元钱
		System.out.println("小芳通过" + day + "天存到了" + money + "元钱");

	}
}

【作业7】一个数如果恰好等于它的因子之和,这个数就是完数,例如 6 = 1 + 2 + 3,编程找出1000内所有的完数。

/*
什么是完数?
	一个数如果恰好等于它的因子之和,这个数就是完数。

那么因子怎么找?
	10的因子?
		10 % 1 == 0
		10 % 2 == 0
		10 % 5 == 0
	不算10本身。
	10的因子:
		1 + 2 + 5 = 8

运行结果:  
	6
	28
	496
*/
public class Homework7{
	public static void main(String[] args){
		// 1不属于完数。从2开始判断
		// 第一步:先从1到1000,每个数字都取出来
		for(int i = 2; i <= 1000; i++){
			// 第二步:在这里可以拿到i,那么此时应该判断i是否是一个完数。
			// 这个数字有了,找这个数字的因子。
			// 假设现在这个数字就是6,i等于6
			int sum = 0;
			for(int j = 1; j <= i / 2; j++){
				//j取到的值是:1 2 3 4 5
				//但实际上j取到哪儿就行了:1 2 3,取这几个数就行了。
				//取到一半就行。
				if(i % j == 0){
					//此时j就是因子。
					// 记得将因子j追加,累计。
					sum += j;
				}
			}
			// 以上for结束表示:所有因子求和完毕了。
			if(i == sum){
				//i是一个完数
				System.out.println(i);
			}
		}
	}
}

传送门

上一章:JavaSE 基础 - 第六章 控制语句
下一章:JavaSE 基础 - 【1-6章 - 内容回顾】

你可能感兴趣的:(JavaSE)