抱着试试看的态度做了下,勉强做了第二、三题,不知道是否符合要求,但是对复习巩固确实很有效。第一题还是不会啊,还请多多指教哦。
第二题:求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中。(其中n个是求出的各个素数,还有一个是随机添加其中的一个素数)
这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)
package com.itheima;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
/*思路:
* 1.求1到100之间的素数,首先应该有一个判断某数是否为素数的方法。
* 2.因为素数的个数n不确定,而要将其存放于数组,但是数组长度是固定的,如直接定义数组,
* 其长度无法准确定义,但是想到集合是可变长度的,且ArrayList可转换为数组,故使用
* ArrayList先存放数组元素,再转换为int数组。
* 3.要在素数数组中随机插入一个素数,可使用ArrayList的add(int index, E element) 方法,
* 其添加位置index有Random类随机产生。而添加的素数由手动键盘输入。
* 4.查找相同的那个素数可由两个for语句嵌套遍历数组得到。
*/
public class TestTwo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//调用getPrimeToList方法。得到素数对应Integer组成的ArrayList集合
ArrayList<Integer> al = primeToList();
//调用listToArray(ArrayList<Integer> al)方法,将al转换成int[];
int[] arr = listToArray(al);//如输入的不是数字,会产生异常
String prime = getAlikeEle(arr);
System.out.println(prime);
}
//获取相同的素数,
public static String getAlikeEle(int[] arr){
for(int x=0;x<arr.length-2;x++){
for(int y=x+1;y<arr.length-1;y++){
if(arr[x]==arr[y])
return "相同的素数"+arr[x]+"位于素数表的"+x+"位置和"+y;
//该处的素数表值得是按从小到大排列的100以内的素数表
}
}
return -1+"";
}
//在ArrayList集合中随机插入录入的素数,并返回一个Object数组
public static int[] listToArray(ArrayList<Integer> al)throws Exception{
//产生一个位于在al角标内的随机数,用于指定素数插入的位置
int r = new Random().nextInt(al.size()-1);
//创建键盘输入流,读取键盘录入的素数的字符串表示形式。
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
//读取键盘录入,去除两端空格。
String line = bufr.readLine().trim();
//如果输入为null,或者不是纯数字,报异常
if((line==null) && (line.matches("\\d{1,3}")))
throw new RuntimeException("输入的不是数字");
//将int类型的字符串转换为Integer对象
Integer insertPrime = Integer.valueOf(line);
//判断输入的数字是否为1到100间的素数,如不是直接报异常
int a = insertPrime;
if(a<1 || a>100 || !(TestTwo.isPrime(a)))
throw new RuntimeException("输入的素数不是1到100间的素数");
//将输入的素数随机插入al集合中
al.add(r, insertPrime);
//遍历Object[]将其转换为int数组
int[] arr = new int[al.size()];
for(int i=0;i<al.size();i++){
arr = al.get(i);
}
return arr;
}
//获取1到100内的素数,并存放到一个ArrayList集合中
public static ArrayList<Integer> primeToList(){
//创建ArrayList,并加范型,只允许存入Integer类型的对象
ArrayList<Integer> al = new ArrayList<Integer>();
for(int x=2;x<100;x++){ //因1和100都不是素数,故不作判断
if(TestTwo.isPrime(x))
al.add(x); //自动装箱,x封装为Integer
}
if(al.size()==0)
return null; //如果al为null,表示1到100之间无素数
return al;
}
/*判断一个数是否为素数的方法
*参考素数判定的“埃拉托斯特尼筛法”,检查一个正整数N是否为素数,
*最简单的方法就是试除法,将该数N用小于等于根号N的所有素数去试除,若均无法整除,则N为素数
*/
public static boolean isPrime(int num){
if(num<=1)
return false; //1不是素数,负数不考虑
int x = (int) Math.ceil(Math.sqrt(num));
for(int i=2;i*i<=x;i++){
if(num%i==0)
return false; //num有1和其本身以外的因子,故不是素数
}
return true; //num没有1和其本身以外的因子,故不是素数
}
}
第三题:在一个文件夹内有文件夹和文件,文件名的格式为:数字+名称.java。
要求:把所有的.java文件复制一份,变为文件名格式为:数字+名称+数字.java。
(其中数字是相对应的,名称由字母组成。如:01Demo.java——>01Demo01.java)
package com.itheima;
import java.io.*;
/*
* 思路分析:
*1.复制.java文件用FileReader和FileWriter,可加BufferedReader和BufferedWriter提高效率。
*2. 同时因为只复制.java文件,需要进行文件过滤,用File对象的
* File[] listFiles(FilenameFilter filter) 方法获取.java文件对象。
* 这里不采用获取文件名的方式,因为要判断.java文件不是目录,而是文件,同时在读取流读取的时候也可直接使用。
*3.获取文件名前面的数字,加到原文件名的.java前面。
*4.将数据写到新文件名对应的目标文件中
*/
public class TestThree {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("F:\\");
if(!(file.exists()&&file.isDirectory()))
throw new NullPointerException("路径有误"); //如给定的文件夹不存在,抛异常
//new一个本类对象调用复制文件的方法
new TestThree().copyJava(file);
}
//实现.java文件复制的方法,此方法只能实现复制后的文件仍处于原文件夹内
public void copyJava(File file){
//获取.java文件对象,需传入一个过滤器,并将对象存入一个File数组中
File[] files = file.listFiles(new FilterByJava());
//定义读取流和写入流,因操作文本文件,用字符流缓冲区提高效率
BufferedReader bufr = null;
BufferedWriter bufw = null;
//for循环实现对每一个.java文件的读写
for(File srcFile : files){
if(srcFile.isDirectory()) //如果srcFile是一个后缀为.java的目录
continue; //不再复制,而继续遍历下一个文件。
//获取复制的目的地,并用正则表达式获取写入目的地的字符串表示,即copyName
String[] sfile = srcFile.getAbsolutePath().split("\\.");
String copyName = sfile[0].replaceAll("((\\d+)(.)+)","$1$2")+".java";
File desFile = new File(copyName);
try{
bufr = new BufferedReader(new FileReader(srcFile));
bufw = new BufferedWriter(new FileWriter(desFile));
String line = null;
//频繁的读写操作
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch(IOException e){
throw new RuntimeException("文件复制失败!");
}
finally{
try {
if(bufw!=null)
bufw.close();
}
catch (IOException ex1) {
// TODO Auto-generated catch block
throw new RuntimeException("写入流关闭异常");
}
finally{
if(bufr!=null)
try{
bufr.close();
}
catch(IOException ex2){
throw new RuntimeException("读取流关闭异常");
}
}
}
}
}
}
/**按文件名过滤.java文件
* */
class FilterByJava implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".java");
}
}
|
|