Java程序设计:必实验1 基本类型应用

文章讲述了如何创建100x100的二维数组并随机赋值,使用冒泡排序找到最大5个数的优化方法,以及处理居民阶梯电价和正整数逆序打印的编程问题。
摘要由CSDN通过智能技术生成

(1)创建一个100×100的二维数组,对数组中的元素进行随机赋值(要求使用Math.random()生成0-1之间的浮点数)。通过算法找到该数组中最大的5个数,要求从大到小输出,同时计算整个程序所耗费的时间,并分析算法的复杂度(如果复杂度较高会扣5分)。在报告中附上程序截图、运行结果截图和详细的文字说明。(40分)

1.思路:把100×100的二维数组用10000的一维数组存储,然后对一维数组进行冒泡升序排序,最后逆序把后5位输出即可,复杂度是O(n*n),其中n*n=10000*10000。

package homework2;

public class task1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long starttime = System.currentTimeMillis();
        double a[][] = new double [100][100];
        double k[] = new double [10000];
        int cnt = 0;
        for(int i=0;i<100;i++)
        {
        	for(int j=0;j<100;j++)
        	{
        		a[i][j] = Math.random();
        		k[cnt++] = a[i][j];
        	}
        }
        //冒泡排序
        for(int i=0;i<10000-1;i++)
        {
        	for(int j=0;j<10000-1-i;j++)
        	{
        		if(k[j]-k[j+1]>1e-9)//浮点数比大小
        		{
        			double temp = k[j];
        			k[j] = k[j+1];
        			k[j+1] = temp;
        		}
        	}
        }
        for(int i=9999;i>=9995;i--)
        {
        	System.out.println(k[i]);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("程序运行了"+(endtime-starttime)+"ms");
	}

}

2.优化思路:用大小为5的一维数组max_five,下标为0为五个数中的最大值,下标为1为五个数中的次大值,以此类推。在遍历二维数组时,大于五个数中的最大值先更新,大于五个数中的次大值后更新,以此类推,同时每次更新时,更新max_five中的其它值。复杂度O(n*n),其中n*n=100*100。

package homework2;

public class task2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long starttime = System.currentTimeMillis();
		double a[][] = new double [100][100];
		double max_five []= new double [5];
		for(int i=0;i<100;i++)
        {
        	for(int j=0;j<100;j++)
        	{
        		a[i][j] = Math.random();
        	}
        }
		for(int i=0;i<100;i++)
		{
			for(int j=0;j<100;j++)
			{
				if(a[i][j]-max_five[0]>1e-9)
				{
					max_five[4]=max_five[3];
					max_five[3]=max_five[2];
					max_five[2]=max_five[1];
					max_five[1]=max_five[0];
					max_five[0]=a[i][j];
				}
				else if(a[i][j]-max_five[1]>1e-9)
				{
					max_five[4]=max_five[3];
					max_five[3]=max_five[2];
					max_five[2]=max_five[1];
					max_five[1]=a[i][j];
				}
				else if(a[i][j]-max_five[2]>1e-9)
				{
					max_five[4]=max_five[3];
					max_five[3]=max_five[2];
					max_five[2]=a[i][j];
				}
				else if(a[i][j]-max_five[3]>1e-9)
				{
					max_five[4]=max_five[3];
					max_five[3]=a[i][j];
				}
				else if(a[i][j]-max_five[4]>1e-9)
				{
					max_five[4]=a[i][j];
				}
			}
		}
		for(int i=0;i<5;i++)
		{
			System.out.println(max_five[i]);
		}
		long endtime = System.currentTimeMillis();
	    System.out.println("程序运行了"+(endtime-starttime)+"ms");
	}

}

(2)某省居民电价分三个“阶梯”:

对于用电量50度以内的这部分电量,电价为0.65元/度;

对于用电量在51度至220度之间的这部分电量,电价为0.68元/度;

对于用电量超过220度的这部分电量,电价为0.75元/度。

编写程序,用户从键盘输入用电量(要求在不终止程序的情况下能循环10次从键盘读入10个数字:48、52、230、90、80、89、510、60、1、10),程序输出用户应缴纳的电费。在报告中附上程序截图、运行结果截图和详细的文字说明。(25分)

思路:运用条件语句if,else if,else对不同情况分别进行答案计算即可。

package homework2;

import java.util.Scanner;

public class task3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long starttime = System.currentTimeMillis();
        Scanner cin=new Scanner(System.in);
        for(int i=0;i<10;i++)
        {
        	double k = cin.nextInt();
        	double ans = 0;
        	if(k<=50)
        	{
        		ans = (double)k*0.65;
        	}
        	else if(k<=220)
        	{
        		ans = (50*0.65+(double)(k-50)*0.68);
        	}
        	else 
        	{
        		ans = (50*0.65+170*0.68+(double)(k-50-170)*0.75);
        	}
        	System.out.println(String.format("%.2f", ans));
        }
	}

}

(3)编写程序:用户从键盘输入1个正整数,程序逆序打印出该正整数的各位数字(例如:某个正整数为123456,程序输出654321),要求在不终止程序的情况下能循环10次从键盘读入。在报告中附上程序截图、运行结果截图和详细的文字说明。(25分)

思路:通过不断进行输出各位数以及除10的操作即可实现逆序输出。

package homework2;

import java.util.Scanner;

public class task4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		for(int i=0;i<10;i++)
		{
			int num = cin.nextInt();
			while(num != 0)
			{
				System.out.print(num%10);
				num/=10;
			}
			System.out.println();
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值