第二题:从控制台输出如下结构:
package day04.homework;
public class HomeWork2 {
public static void main(String[] args) {
for(int i =1;i<=6;i++){ //外层控制行数,这里行数我从1开始
for(int j=1;j<=7-i;j++){ //内层控制列数,每行星星数为7-i
System.out.print("*");
}
System.out.println();//换到下一行,记得输出内容要为空!!!
}
}
}
运行结果:
- 个人小结:做打印图形的题型时,重点在于找规律!!!
第三题:判断101-200之间有多少个素数,并输出所有素数。
程序分析:
(1)素数是:只能被1或本身整除的数,如:3,5,7,11,131...
(2)判断素数的方法:用一个数分别去除2到sqrt(这个数)
(3)其实用这个数分别去除2到他本身少1的数也可以,但是运算时间增加了
(4)如果能被整除,则表明此数不是素数,反之是素数
- 方法一:用这个数分别去除2到该数的前一个数(它本身少1的数),虽然在时间效率上不是最佳,但比较容易理解
public class HomeWork3 {
public static void main(String[] args) {
int i,j;//定义i为要判断的数,变量j为除数(因数)
int count =0;//定义count记录素数的个数
System.out.println("101-200之间的素数有:");
//方法1:用这个数分别去除2到它本身少1的数
for(i=101;i<=200;i++){
for(j=2;j<i;j++){//除数从2开始,到该数的前一个数
//如果这个数除以某个数能够整除,那么它不是素数,直接跳出内层循环,继续判断下一个数
if(i%j==0){
break;
}
}
//做完上面的判断和遍历后,除数等于它本身了,那么它是素数
if(j==i){
count++;//记录数加1
System.out.print(i+" ");//这里我用空格隔开输出数
}
}
System.out.println("\n"+"共有"+count+"个素数");
}
}
运行结果:
- 方法二:除数范围缩小到该数的一半,加快时间效率
分析:设 i 为非素数,那么它可以进行因数分解,即i=a*b*c……,例如i=26时,26=2*13。我们都知道2是最小的质数,所以i的 最小因数是2,那么最大的因数值就是i/2。换句话说就是,因数(即除数)的范围是2到i/2。比如根据本题判断150是不是素数,只需要让150除以2到75之间的数,不需要从2到149都除一遍。
public class HomeWork03 {
public static void main(String[] args) {
int i,j;//定义i为要判断的数,变量j为除数(因数)
int count =0;//定义count记录素数的个数
System.out.println("101-200之间的素数有:");
//方法2:
for(i=101;i<=200;i++){
for(j=2;j<i/2;j++){//除数范围从2开始,到i/2
//如果这个数除以某个数能够整除,那么它不是素数,跳出内层循环,判断下一个数
if(i%j==0){
break;
}
}
if(j>=i/2){
count++;//记录数加1
System.out.print(i+" ");//这里我用空格隔开输出数
}
}
System.out.println("\n"+"共有"+count+"个素数");
}
}
运行结果:
第四题:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方
- 方法一:
public class HomeWork4 {
public static void main(String[] args) {
int i,j;
System.out.println("所有的水仙花数为:");
for(i =100;i<1000;i++){//三位数是100~999的范围
int bai =i/100; //得到百位
int shi =i/10%10;//得到十位
int ge =i%10; //得到个位
int sum =bai*bai*bai+shi*shi*shi+ge*ge*ge;//得到各位数字立方和
if(sum==i){//判断各位数字立方和是否等于该三位数
System.out.print(i+" ");
}
}
}
}
- 方法二:使用Math类下的pow()方法
用Math.pow(a,b)方法返回的是一个“a的b次方”的double类型值,具体可查阅JDK帮助文档。
public class HomeWork4 {
public static void main(String[] args) {
int i,j;
System.out.println("所有的水仙花数为:");
for(i =100;i<1000;i++){//三位数是100~999的范围
int bai =i/100; //得到百位
int shi =i/10%10;//得到十位
int ge =i%10; //得到个位
//用Math.pow(a,b)方法返回一个“a的b次方”的double类型值
if(Math.pow(bai,3)+Math.pow(shi,3)+Math.pow(ge,3) == i){
System.out.print(i+" ");
}
}
}
}
两个方法的运行结果都是如下图:
第五题:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k(即n不等于k),但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
import java.util.Scanner;
public class HomeWork5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个要分解的正整数:");
int n =input.nextInt();
System.out.print(n+"=");
for(int k=2;k<=n;k++){//先找到一个最小的质数k=2
while(n!=k && n%k==0){//如果n不等于k,且n能被k整除
n=n/k; //作为新的正整数n
System.out.print(k+"*");//输出质因数
}
if(n==k){//如果当前的n是一个质数,无法做上面的循环操作
System.out.print(k);//直接跟在上一个质因数后面输出
break;//直接跳出for循环
}
}
}
}
运行结果: