A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 神之梦   /  2013-7-7 15:02  /  8349 人查看  /  182 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

俺来猫一猫,顺便顶楼主
回复 使用道具 举报
本帖最后由 朱晓杰 于 2013-7-12 17:15 编辑
  1. /**
  2. * 题目1、键盘录入一个正整数,将其分解质因数。如:输入30,打印出30=2*3*5。
  3. *
  4. * 分   析:该题的目的是将任意一个正整数分解质因数,涉及到了数学知识,要想完全弄明白,必须清楚涉及到的几个知识
  5. *
  6. * 知识1、什么是分解质因数?
  7. *                     每个合数都可以写成几个质数相乘的形式,其中每个指数都是这个合数的因数,叫做这个合数的分解质因数。
  8. *                     注意:分解质因数只针对合数。
  9. *                   
  10. *       分解质因数的概念我们清楚了,那么什么是合数,什么是质数呢?
  11. *
  12. * 知识2、合数:自然数中除了能被1和本身整除外,还能被其他的数整除
  13. *
  14. *        质数:自然数中除了能被1和本身整除外,不能被其他的数整除
  15. *        
  16. * 结 果: 合数 = 质数 * 质数 * 质数 ...,这个过程就叫做分解质因数
  17. *
  18. *       那么如何在程序中体现呢?
  19. *      
  20. *       根据以上概念,键盘录入的正整数  x 是有限制的,必须是大于1的合数,那么我们就需要进行判读,问题随之就来了
  21. *      
  22. *       如何判断一个正整数是否为合数?
  23. *      
  24. *        将该 循环对 处于  1~x 之间的正整数取余
  25. *      
  26. *       如果是
  27. *               若能被整除,则返回该被除数
  28. *      
  29. *       如果不是
  30. *               提示用户输入了非法值
  31. * 思路:1.接收键盘录入的数据
  32. *                
  33. *       2.判断接收的数据是否为合数
  34. *      
  35. *       3.返回结果
  36. *                                       
  37. */
  38. import static java.lang.System.*;
  39. import java.util.Scanner;
  40. public class PrimeFactors {

  41.         public static void main(String[] args) {
  42.                 out.println("/********** 程序功能:分解质因数      **********/");
  43.                 out.println("/********** 提示:请输入一个合数! **********/");
  44.                
  45.                 //获取键盘录入的正整数
  46.                 Scanner scan = new Scanner(in);
  47.                 int receVal = scan.nextInt();
  48.                
  49.                 //判断该正整数是否为合数
  50.                 boolean isComNum = isCompositeNum(receVal);
  51.                 if(isComNum){
  52.                         out.println(receVal + "=" + getPFRes(receVal) + ";");
  53.                 }else
  54.                         out.println(receVal + " 不是合数!");
  55.         }

  56.         /**
  57.          * @功能:获取一个合数分解质因数的结果
  58.          * @param:receVal
  59.          * @return:String,例如:30=2*3*5;
  60.          * */
  61.         public static String getPFRes(int receVal){
  62.                 StringBuilder resStr = new StringBuilder();
  63.                
  64.                 for(int i = 2; i < receVal - 1; i++){
  65.                         if(receVal % i == 0 && isPrimeNum(i)){
  66.                                 receVal = receVal / i;
  67.                                 //如果是resNum是素数,则直接返回 i * resNum,程序结束,否则继续循环,递归
  68.                                 resStr.append(i).append("*");
  69.                                 if(isPrimeNum(receVal)){
  70.                                         resStr.append(receVal);
  71.                                 }else{
  72.                                         resStr.append(getPFRes(receVal));
  73.                                 }
  74.                                 break;
  75.                         }
  76.                 }
  77.                 return resStr.toString();
  78.         }
  79.        
  80.         /**
  81.          * @功能:判断一个数是否为4数
  82.          * @param:receVal
  83.          * @return:boolean
  84.          * */
  85.         public static boolean isCompositeNum(int receVal){
  86.                 boolean flag = false;
  87.                 if(receVal < 1)
  88.                         flag = false;
  89.                 else{
  90.                         for(int i = 2; i < receVal; i++){
  91.                                 if(receVal % i == 0){
  92.                                         flag = true;
  93.                                         break;
  94.                                 }
  95.                         }
  96.                 }
  97.                 return flag;
  98.         }
  99.        
  100.         /**
  101.          * @功能:判断一个正整数是否为质数(素数)
  102.          * @param:num
  103.          * @return:boolean
  104.          * */
  105.         public static boolean isPrimeNum(int num){
  106.                 boolean flag = true;
  107.                 for(int i = num - 1; i > 1; i--){
  108.                         if(num % i == 0){
  109.                                 flag = false;
  110.                                 break;
  111.                         }
  112.                 }
  113.                 return flag;
  114.         }
  115. }
复制代码
  1. /**
  2. * 题目2、求出1-100之间的素数,假设有n个,将这些素数存入a[n+1]的数组中,        其中n个是求出的各个素数,还有一个是随机添加其中的一个素数
  3. *              这样数组中就有相同的两个素数,写一个搜索算法,找出数组中相同的那个素数。(随机添加的素数,可手动指定,也可利用随机方法产生)
  4. *       (注:存入数组后,数组中的所有元素理论上是无序的,相同的那个素数不一定就等于a[n],而是被存入了数组中的某个角标上)
  5. *      
  6. * 分析: 1、找出1-100之间的素数,并存入数组;
  7. *                  2、产生你找出素数中随机的一个,也存入数组,位置不确定;
  8. *       3、找出数组中相同的那个素数。
  9. *
  10. * 问题:1.什么是素数?由于1-100间的素数的个数不确定,所以数组如何定义?
  11. *
  12. *                  2.随机素数如何产生?手动?随机数?
  13. *
  14. *                  3.如何搜索相同的那个素数?且保证程序效率高
  15. *                   查找相同的那个素数,可以用遍历数组的方法,可是效率有点儿低,需要遍历所有数组,那么折半查找呢?
  16. *                        
  17. */
  18. import java.util.*;
  19. public class SearchPrime {

  20.         public static void main(String[] args) {
  21.                 int maxNum = 100,primeNum = 17;
  22.                 Integer[] primeArrays = getPrimeArrays(maxNum,primeNum);
  23.                 Arrays.sort(primeArrays);
  24.                 int index = Arrays.binarySearch(primeArrays, primeNum);
  25.                 System.out.println("数组中与 " + primeNum + " 相同的素数的位置是:primeArrays[" + index + "]=" + primeArrays[index]);
  26.         }
  27.        
  28.         /**
  29.          * @功能:求出1-100间的素数,手动指定一个素数,并将求出的素数与指定的素数存入数组
  30.          * @params:maxNum,primeNum
  31.          * @return:Integer[]
  32.          * */
  33.         public static Integer[] getPrimeArrays(int maxNum,int primeNum){
  34.                 Integer[] primeArrays = null;
  35.                 int count = 0;
  36.                 Collection<Integer> collect = new ArrayList<Integer>();
  37.                 for(int i = 2; i < maxNum; i++){
  38.                         //判断一个数是否为素数
  39.                         if(isPrimeNum(i)){
  40.                                 collect.add(i);
  41.                                 count++;
  42.                         }
  43.                 }
  44.                 collect.add(primeNum);
  45.                 primeArrays = collect.toArray(new Integer[count+1]);
  46.                 return primeArrays;
  47.         }
  48.        
  49.         /**
  50.          * @功能:判断一个正整数是否为质数(素数)
  51.          * @param:num
  52.          * @return:boolean
  53.          * */
  54.         public static boolean isPrimeNum(int num){
  55.                 boolean flag = true;
  56.                 for(int i = num - 1; i > 1; i--){
  57.                         if(num % i == 0){
  58.                                 flag = false;
  59.                                 break;
  60.                         }
  61.                 }
  62.                 return flag;
  63.         }
  64. }
复制代码
  1. import static java.lang.System.out;
  2. import java.io.*;
  3. /**
  4. * 题目3. 背景:在一个文件夹内有文件夹和文件,文件名的格式为:数字+名称.java。
  5. *                
  6. *        要求:把所有的.java文件复制一份,变为文件名格式为:数字+名称+数字.java。
  7. *                            其中数字是相对应的,名称由字母组成。如:01Demo.java——>01Demo01.java
  8. *           
  9. *                 分析:1.在一个文件夹内有文件夹和文件, 需要遍历文件夹,用到了递归
  10. *   
  11. *                       2.更改文件名,需要对文件名进行操作,用到了字符串操作
  12. */
  13. public class CopyFiles {

  14.         public static void main(String[] args) {
  15.                
  16.                 String path = "C://java//";
  17.                
  18.                 File rootPath = new File(path);
  19.                
  20.                 if(!rootPath.exists()){
  21.                         out.println(rootPath + "目录或文件不存在!");
  22.                 }else if(rootPath.isFile()){
  23.                         out.println(rootPath + "是一个文件!");
  24.                 }else if(rootPath.isDirectory()){
  25.                         try {
  26.                                 FileUtils(rootPath);
  27.                         } catch (Exception e) {
  28.                                 e.printStackTrace();
  29.                         }
  30.                 }
  31.         }
  32.        
  33.         /**
  34.          * @功能:文件操作路
  35.          * @param:rootPath
  36.          * @return:void
  37.          * */
  38.         private static void FileUtils(File rootPath)throws Exception{
  39.                 File[] files = rootPath.listFiles();
  40.                 for(File file : files){
  41.                         if(file.isFile()){
  42.                                 //重命名文件
  43.                                 renameFiles(file);
  44.                         }else if(file.isDirectory()){
  45.                                 //递归继续遍历
  46.                                 FileUtils(file);
  47.                         }
  48.                 }
  49.         }
  50.        
  51.         /**
  52.          * @功能:重命名文件
  53.          * @param:file
  54.          * @return:void
  55.          * */
  56.         private static void renameFiles(File file) throws Exception{
  57.                 //获取上级根目录
  58.                 String parentPath = file.getParent() + File.separator;
  59.                 //文件名
  60.                 String fileName = file.getName();
  61.                 //重命名后的文件名
  62.                 String newFileName = "";
  63.                 //重命名后的文件
  64.                 File destFile = null;
  65.                 if(fileName.endsWith(".java")){
  66.                         fileName = fileName.substring(0,fileName.indexOf(".java"));
  67.                         newFileName = fileName + fileName.substring(0,fileName.indexOf("Demo")) + ".java";
  68.                         destFile = new File(parentPath + newFileName);
  69.                         //复制文件
  70.                         copyFile(file, destFile);
  71.                 }
  72.         }
  73.        
  74.         /**
  75.          * @功能:复制文件
  76.          * @param:srcFile,destFile
  77.          * @return:void
  78.          * */
  79.         private static void copyFile(File srcFile, File destFile)
  80.                         throws FileNotFoundException, IOException {
  81.                 BufferedReader reader = new BufferedReader(new FileReader(srcFile));
  82.                 BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
  83.                 String content = "";
  84.                 while((content = reader.readLine()) != null){
  85.                         writer.write(content);
  86.                         writer.newLine();
  87.                         writer.flush();
  88.                 }
  89.                 if(writer != null){
  90.                         writer.close();
  91.                 }
  92.                 if(reader != null){
  93.                         reader.close();
  94.                 }
  95.         }
  96. }
复制代码

点评

第一题输入8结果是等于2,第三题出现角标越界、、、  发表于 2013-7-12 00:34

评分

参与人数 1技术分 +2 收起 理由
神之梦 + 2 第二题的

查看全部评分

回复 使用道具 举报

版主,第一题已经修改完毕,能麻烦你说一下第三题在什么操作的情况下出现角标越界呢?

点评

突然发现你是3天前看的题,所以不能给你加分了,已经加了的就算了,哈哈~  发表于 2013-7-12 21:18
我测试的文件夹里面01到09个文件,运行后只复制到了07,还有08、09没有被复制,异常显示角标-1,27行  发表于 2013-7-12 21:16
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马