(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();
}
}
}