Java作业1

目录

题目一 绘制金字塔

题目要求

题目分析 

代码示例

运行结果

题目二 贷款还款计算器

题目要求

代码示例

运行结果

题目三 打印月历

题目要求

题目分析

问题一 如何打印?

问题二 打印多少个数字,又该打印多少个空格?

问题三 每个月的天数如何解决?

代码示例

输入输出

题目四 找完数

题目要求

代码示例

运行结果


题目一 绘制金字塔

题目要求

编写程序,从标准输入获取层数,层数大于1,小于等于11,以输入为9为例,输入以下图案,每个数字保持4个字符宽度,最后一行后无换行。

题目分析 

 三行先演示一下:
               1
         1    2    1
   1    2    4    2    1
找规律:
第1行=倒数第3行:15个空格    无递增      打印到2^0
第2行=倒数第2行:  9个空格    1步递增    打印到2^1
第3行=倒数第1行:  3个空格    2步递增    打印到2^2

由于每一个数字占4位。
所以空格数减3
第1行=倒数第3行: 8个空格    无递增      打印到2^0
第2行=倒数第2行: 4个空格    1步递增    打印到2^1
第3行=倒数第1行: 0个空格    2步递增    打印到2^2
规律:(设行数为n,当前行序列为i)
1. 第一行空格数为 (n-1)*4,下一行减4,减到0为止
2. 左半边打印数字,从1开始打印,打印的数字翻倍,直到2^(i-1)。
3. 右半边从2^(i-2)开始打印打印到1为止。                   

代码示例

c代码

#include <stdio.h>
#include <math.h>
int main()
{
	int n=9;
	int SpaceN=(n-1)*4; //第一行空格数(不算数字占位),逐行减4,减到0为止
	for(int i=1;i<=n;i++){	//最外层循环控制行
		for(int k=1;k<=SpaceN;k++){
			printf(" ");	//打印空格
		}
		for(int k=1;k<=(int)pow(2,i-1);k*=2){	//打印左半边
			printf("%4d",k);
		}
		for(int k=(int)pow(2,i-2);k>=1;k/=2){	//打印右半边
			printf("%4d",k);
		}
		if(SpaceN)
			printf("\n");
		SpaceN=SpaceN-4;
	}
	return 0;		
}    

运行结果

                                   1
                               1   2   1
                           1   2   4   2   1
                       1   2   4   8   4   2   1
                   1   2   4   8  16   8   4   2   1
               1   2   4   8  16  32  16   8   4   2   1
           1   2   4   8  16  32  64  32  16   8   4   2   1
       1   2   4   8  16  32  64 128  64  32  16   8   4   2   1
   1   2   4   8  16  32  64 128 256 128  64  32  16   8   4   2   1
--------------------------------
Process exited after 0.01293 seconds with return value 0
请按任意键继续. . .

Java代码 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n=in.nextInt(); //输入需要打印的行数
		int SpaceN=(n-1)*4; //第一行空格数(不算数字占位),逐行减4,减到0为止
		for(int i=1;i<=n;i++){	//最外层循环控制行
			for(int k=1;k<=SpaceN;k++){
				System.out.printf(" ");	//打印空格
			}
			for(int k=1;k<=(int)Math.pow(2,i-1);k*=2){	//打印左半边
				System.out.printf("%4d",k);
			}
			for(int k=(int)Math.pow(2,i-2);k>=1;k/=2){	//打印右半边
				System.out.printf("%4d",k);
			}
			if(SpaceN!=0)
				System.out.printf("\n");
			SpaceN=SpaceN-4;
		}	
	}

}

改变n的值可以输出多种不同结果

此代码通用,只需要修改空格数的递减量和打印数字的占位数即可,事实上,打印数字的位数=空格数的递增数。 

题目二 贷款还款计算器

题目要求

房贷、车贷、教育贷、消费贷,要贷款就要还款。所以在贷款前先想清楚贷款的目的是否必须?所贷的款额能否偿还?自己有无偿付能力?如果以上问题的答案都是否,请三思而行。要让自己成为富翁,而不是负翁。

假设你从某银行贷了一笔款额loan_amount, 还款年利率为annual_interest_rate,可相应计算每月还款利率monthly_interest_rate,还款年限为num_of_year,每月你都需要向银行归还一定金额monthly_payment,公式如下:

现请编写一程序,输入贷款金额,还款年限,按照年利率从5%到10%,以0.25%为步长,计算在不同利率情况下每月应还款额,以及总还款金额。

示例如下:

       Enter loan amount: 10000
       Enter number of year: 5

       Interest Rate    Monthly Payment     Total Payment
       5.000%            188.71                      11322.74
       5.250%            189.86                      11391.59
       5.500%            191.01                      11460.70
       ...
       9.75%              211.24                      12674.55
       10.000%          212.47                      12748.23

代码示例

java代码

import java.util.Scanner;

public class Payment {
	public static void main(String[] args) {
		//输入
		Scanner in = new Scanner(System.in);
		System.out.print("Enter loan amount:");
		double loan_amount=in.nextDouble();
		System.out.print("Enter number of year:");
		double num_of_year=in.nextDouble();
		//初始化
		double annual_interest_rate=0.05;
		double monthly_interest_rate=annual_interest_rate/12;
		double monthly_payment=loan_amount*monthly_interest_rate/(1-1/Math.pow(1+monthly_interest_rate,12*num_of_year));
		double Total_Payment=monthly_payment*12*num_of_year;
		//表头
		System.out.print(String.format("\n%-20s%-20s%-20s\n","Interest Rate","Monthly Payment","Total Payment"));
		
		while(annual_interest_rate<0.1025){
			//输出表格
			System.out.print(String.format("%-4.2f",annual_interest_rate*100));
			System.out.printf("%%%15s","");
			System.out.print(String.format("%-20.2f",monthly_payment));
			System.out.print(String.format("%-19.2f\n",Total_Payment));
			//下一次输出的值开始变化
			annual_interest_rate+=0.0025;
			monthly_interest_rate=annual_interest_rate/12;
			monthly_payment=loan_amount*monthly_interest_rate/(1-1/Math.pow(1+monthly_interest_rate,12*num_of_year));
			Total_Payment=monthly_payment*12*num_of_year;
		}	
	}
}

运行结果

Enter loan amount:10000
Enter number of year:5

Interest Rate       Monthly Payment     Total Payment
5.00%               188.71              11322.74
5.25%               189.86              11391.59
5.50%               191.01              11460.70
5.75%               192.17              11530.06
6.00%               193.33              11599.68
6.25%               194.49              11669.56
6.50%               195.66              11739.69
6.75%               196.83              11810.08
7.00%               198.01              11880.72
7.25%               199.19              11951.62
7.50%               200.38              12022.77
7.75%               201.57              12094.18
8.00%               202.76              12165.84
8.25%               203.96              12237.75
8.50%               205.17              12309.92
8.75%               206.37              12382.34
9.00%               207.58              12455.01
9.25%               208.80              12527.94
9.50%               210.02              12601.12
9.75%               211.24              12674.55
10.00%               212.47              12748.23

题目三 打印月历

题目要求

编写一个程序,按照1月到12月的顺序输出当年的日历。其中输入为年份,以及当年的第一天为星期几,如1为周一,2为周二。

假设输入年份2013,1月1日为周二,则输出当年的日历如下所示:

题目分析

一个困难的问题,其实我们都可以把它拆解成一个个简单的问题。

我的思路是这样的:

问题一 如何打印?

每打印7个,就换行,没有数字的地方,就打印空格。用一个变量来计我们打印的的次数,只要打印了7次,我们就进行一次换行。好这是怎么打印的问题解决了。

问题二 打印多少个数字,又该打印多少个空格?

然后该打印多少个空格呢,也就是我们需要知道某年的第一天是星期几,这个问题可以参考 

算法:计算某年的第一天是星期几_某年星期几算法-CSDN博客

result=[(year-1)+(year-1)/4-(year/100)+(year/400)+D]%7

year代表年份, D代表这一年的第几天,用一个变量来存储第几天的值。

result=0代笔星期天,1,2,3,4,5,6对于星期一,二,三,四,五,六,也正好对应我们需要打印的空格数。

到这里我们可以打印出第一个月的月历了

问题三 每个月的天数如何解决?

其实也就是闰年,平年的问题。闰年2月份29天,平年28天,其它的月份的天数我们都知道。然后我们把每个月的的天数存到数组里面遍历即可。我们默认2月28天,再用一个判断语句判断是否是闰年,如果是,2月的天数+1即可。

代码示例

c代码

//2023.1.1正好是星期天
#include <stdio.h>
int main()
{
	int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int year;
	scanf("%d",&year);
	if(year%400==0 || year%4==0 && year%100!=0)
		monthdays[1]=29;	//如果是闰年,2月份天数应该+1
	int spaceprint;			//月历第一行前面应该打印的空格数
	int days=1;				//第几天,初始化为1
//计算某年的第某天是星期几的算法:
//int result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
//来自CSDN
	for(int i=0;i<12;i++) {
		//打印表头
		switch (i) {
		case 0: printf("           January           \n"); break;
		case 1: printf("          February          \n");break;
		case 2: printf("            March           \n");break;
		case 3: printf("          April            \n");break;
		case 4: printf("             May             \n");break;
		case 5: printf("           June            \n");break;
		case 6: printf("           July            \n");break;
		case 7: printf("         August          \n");break;
		case 8: printf("         September         \n");break;
		case 9: printf("           October            \n");break;
		case 10: printf("         November           \n"); break;
		case 11: printf("         December          \n");break;
		}
		printf("_____________________________\n");
		printf(" Sun Mon Tue Wed Thu Fri Sat\n");
		
		spaceprint=((year-1)+(year-1)/4-(year/100)+(year/400)+days)%7;
		int cnt=0;
		for(int j=0;j<spaceprint;j++){
			printf("    ");
			cnt++;
		}
		for(int j=1;j<=monthdays[i];j++){
			printf("%4d",j);
			cnt++;
			if(cnt==7){
				printf("\n");
				cnt=0;
			}
		}
		printf("\n\n");	//每月打完后还应该打印换行
		days+=monthdays[i];	//第几天的数值增加
	}
	return 0;
}

输入输出

2013
           January
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
           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  30  31

          February
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
                       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

            March
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
                       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  30
  31

          April
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
       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  30

             May
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
               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  30  31

           June
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
                           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
  30

           July
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
       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  30  31

         August
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
                   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  30  31


         September
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
   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  30

           October
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
           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  30  31

         November
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
                       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  30


         December
_____________________________
 Sun Mon Tue Wed Thu Fri Sat
   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  30  31


--------------------------------
Process exited after 2.908 seconds with return value 0
请按任意键继续. . .

java代码

import java.util.Scanner;
public class Payment {
	
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		int[] monthdays={31,28,31,30,31,30,31,31,30,31,30,31};
		int year=in.nextInt();
		if(year%400==0 || year%4==0 && year%100!=0)
			monthdays[1]=29;	//如果是闰年,2月份天数应该+1
		int spaceprintf;			//月历第一行前面应该打印的空格数
		int days=1;				//第几天,初始化为1
		//计算某年的第某天是星期几的算法:
		//int result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7;
		//来自CSDN
		for(int i=0;i<12;i++) {
			//打印表头
			switch (i) {
			case 0: System.out.printf("           January           \n"); break;
			case 1: System.out.printf("          February          \n");break;
			case 2: System.out.printf("            March           \n");break;
			case 3: System.out.printf("          April            \n");break;
			case 4: System.out.printf("             May             \n");break;
			case 5: System.out.printf("           June            \n");break;
			case 6: System.out.printf("           July            \n");break;
			case 7: System.out.printf("         August          \n");break;
			case 8: System.out.printf("         September         \n");break;
			case 9: System.out.printf("           October            \n");break;
			case 10: System.out.printf("         November           \n"); break;
			case 11: System.out.printf("         December          \n");break;
			}
			System.out.printf("_____________________________\n");
			System.out.printf(" Sun Mon Tue Wed Thu Fri Sat\n");
			
			spaceprintf=((year-1)+(year-1)/4-(year/100)+(year/400)+days)%7;
			int cnt=0;
			for(int j=0;j<spaceprintf;j++){
				System.out.printf("    ");
				cnt++;
			}
			for(int j=1;j<=monthdays[i];j++){
				System.out.printf(String.format("%4d",j));
				cnt++;
				if(cnt==7){
					System.out.printf("\n");
					cnt=0;
				}
			}
			System.out.printf("\n\n");	//每月打完后还应该打印换行
			days+=monthdays[i];	//第几天的数值增加
		}
	}
}

运行结果

题目四 找完数

题目要求

一个正整数,若其所有小于自身的因数的和(包括1)与自身相等,则称该数为完数。如

,下一个为

,请编写程序,找出10000以内的完数

【输入形式】

【输出形式】

一行输出一个数

【输入形式】

【输出形式】

6

28

496

8128

代码示例

参考博文

​​​​​C 练习实例19-找出1000以内的所有完数-CSDN博客

java代码

import java.util.Scanner;

public class Payment {
	public static int comNum(int n) {	//comNum()函数判断是否为完数
		int i,sum=0;
		for(i=1;i<n;i++)		//从1开遍历,不包括它本身,遍历出所有因子
		{
			if(n%i==0)			//如果n能被1~(n-1)之间的数整除,说明是因子
				sum+=i;			//因子之和
		}
		if(n==sum)
			return 1;
		else
			return 0;
		}
	public static void main(String[] args) {
		for(int i=1;i<=10000;i++){	//遍历1-1000
			if(comNum(i)==1)		//如果是完数,打印输出
				System.out.println(i);
		}		
	}
}

运行结果

6
28
496
8128

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值