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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 沿途小将 于 2014-8-15 18:31 编辑

试题链接:王老师11期技术分题目
活动目的:练习javaSE知识。
活动奖励:最高2个技术分
结束时间:2014年8月18日,过期提交可能获取不到技术分!
代码提交要求:将自己的源代码压缩然后提交,提交的时候设置为管理员权限,以其他方式提交的答案无效。上交源码的时候不需要将整个工程项目压缩,只需将用到的源文件压缩即可。
题目类型:JavaSE 算法题。
难易程度:容易

这题不会太难,只是有个技巧,可以让代码更少些(纯属个人认为,莫见怪!)。
思路:这是一个求一段数中的所有质数。而且提示了质数有两个特点(只能被1和自己整除),所有我可以用for循环(循环语句都可)让这个数(假设为X)对1到他自己(X)取余,余数等于零则可整除。当余数等于零的个数为二时,该数为质数。其他的为细节,如X的取值范围啦。
我的代码如下:
  1. import java.util.*;

  2. public class Test11 {
  3.         int shu = 0;

  4.         public static void main(String[] args) {
  5.                 new Test11().GetPrime();
  6.         }

  7.         public Test11() {
  8.                 System.out.println("请输入一个大于1且小于500的整数");
  9.                 Scanner sc = new Scanner(System.in);
  10.                 shu = sc.nextInt();
  11.         }

  12.         public void GetPrime() {
  13.                 if (shu < 500 && shu > 1) {
  14.                         for (int i = 1; i <= shu; i++) {
  15.                                 int time = 0;
  16.                                 for (int j = 1; j <= i; j++) {

  17.                                         if ((i % j) == 0) {
  18.                                                 time++;
  19.                                         }

  20.                                 }
  21.                                 if (time == 2) {
  22.                                         System.out.println(i);
  23.                                 }

  24.                         }
  25.                 } else {
  26.                         System.out.println("你输入的数不合要求!");
  27.                 }
  28.         }
  29. }
复制代码

有误处,请多指正!

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

25 个回复

倒序浏览
改进,判断输入的是否符合要求然后让重新输入
回复 使用道具 举报
先来踩一下,回头好好看看
回复 使用道具 举报
太麻烦了:
1. 没有必要统计余数等于零的个数
2. 没有必要让X对1到他自己(X)取余

判断一个自然数是否质数,只需要:
  1. boolean isPrime(int n) {
  2.     if (n == 1) // 1不是质数
  3.         return false;
  4.     if (n <= 3) // 2、3是质数
  5.         return true;
  6.     for (int i = 2; i * i <= n; i++) { // 对于其余的n,只要无法被每一个平方不大于n的数整除,n就是质数
  7.         if (n % i == 0)
  8.             return false; // 只要能被某一个平方不大于n的数整除,n就不是质数
  9.     }
  10.     return true;
  11.      
  12. }
复制代码

打印某一范围内的质数
  1. void primesInRange(int begin, int end) {
  2.     for (int i = begin; i <= end; i++) {
  3.         if (isPrime(i)) // 如果i是质数,则打印
  4.             System.out.println(i);
  5.     }
  6. }
复制代码

点评

省了好多,高手  发表于 2014-8-16 11:24
回复 使用道具 举报
:o楼主你这方法效率虽然不高,但是够直接。。。赞一个。。。
我参考你的搞了个麻烦的,据说能提高效率,有兴趣的大家可以一起探讨下。
  1. import java.util.*;
  2. public class PrimeNumberTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int num;
  7.                 System.out.println("请输入一个大于1且小于500的整数");
  8.                 Scanner sc = new Scanner(System.in);
  9.         num = sc.nextInt();
  10.                 while(num<=1||num>=500)
  11.                 {
  12.                         System.out.println("你输入的数不合要求!");
  13.                         return;
  14.                 }
  15.                 getPrime(num);
  16.         }
  17.         public static void getPrime(int num)
  18.         {
  19.                 int []arr=new int [255];
  20.                 int pc=1,m=3,k=0;
  21.                 arr[0]=2;
  22.                 while(m<=num)
  23.                 {
  24.                         while(arr[k]*arr[k]<=m)
  25.                                 if(m%arr[k]==0)
  26.                                 {/*m是合数*/
  27.                                         m+=2;/*让m取下一个奇数*/
  28.                                         k=1;/*不必用primes[0]=2去测试m,所以k从一开始*/
  29.                                 }
  30.                                 else
  31.                                 k++;/*继续用下一个质数去测试*/
  32.                         if(m>num) break;
  33.                         arr[pc++]=m;
  34.                         m+=2;/*除2外,其余质数均是奇数*/
  35.                         k=1;
  36.                 }
  37.                 /*输出primes[0]至primes[pc-1]*/
  38.                 for(k=0;k<pc;k++)
  39.                         System.out.print(arr[k]+" ");               
  40.         }
  41. }
复制代码
回复 使用道具 举报
左脑想你 发表于 2014-8-15 22:23
改进,判断输入的是否符合要求然后让重新输入

你这个想法也可以,但是还得设一个“退出”的选项,我这不合要求就直接程序执行完了
回复 使用道具 举报
本帖最后由 沿途小将 于 2014-8-16 07:57 编辑
fantacyleo 发表于 2014-8-15 22:49
太麻烦了:
1. 没有必要统计余数等于零的个数
2. 没有必要让X对1到他自己(X)取余

范围1<X<500
回复 使用道具 举报
本帖最后由 沿途小将 于 2014-8-16 08:01 编辑
明天2014 发表于 2014-8-16 02:15
楼主你这方法效率虽然不高,但是够直接。。。赞一个。。。
我参考你的搞了个麻烦的,据说能提高效率,有 ...

你的while();没什么用,你仔细看下。另:你和楼上的是师兄弟吗?方法是一样的。:lol

点评

你判断完了,如果执行了while里的代码,让然不影响下面的getPrime() 方法执行与否  发表于 2014-8-16 11:18
额,我的第一个while不是判断是不是质数的,是用来判断输出1~N之间的质数的。。。跟你for循环里面的i<=shu一个意思。  发表于 2014-8-16 10:52
回复 使用道具 举报
沿途小将 发表于 2014-8-16 07:56
你的while();没什么用,你仔细看下。另:你和楼上的是师兄弟吗?方法是一样的。 ...

:o不是吧?你确定你说的是我的?我没看到有人跟我用一样的方法啊。。。
我在原来的判断基础上做了3点改进:
1.偶数没有必要判断,自然也没有必要对2取余。(当然2除外,2可以单独判断)。
2.取余范围不用1~N,1到N开2次方就可以了。
3.因为合数肯定可以分解成质数和另一个数的乘积。所以判断取余的时候,只对质数取余即可。
如:121  只需对3,5,7,11这几个数进行取余判断即可。。。9不用判断,因为9是合数。(第三点排除的)
回复 使用道具 举报
fantacyleo 来自手机 金牌黑马 2014-8-16 10:54:11
10#
沿途小将 发表于 2014-8-16 07:55
范围1

这无关紧要
回复 使用道具 举报
沿途小将 发表于 2014-8-16 07:56
你的while();没什么用,你仔细看下。另:你和楼上的是师兄弟吗?方法是一样的。 ...

例如;num=600;他还是会执行方法getPrime();
回复 使用道具 举报
明天2014 发表于 2014-8-16 10:46
不是吧?你确定你说的是我的?我没看到有人跟我用一样的方法啊。。。
我在原来的判断基础上做了3点改进 ...

这个思路,确实是能提高很多,我该向你学习

点评

呵,互相学习。我也是到处参考借鉴的,代码中也用了你的不少代码。  发表于 2014-8-16 11:19
回复 使用道具 举报
直接给内外循环加标记,我自己做的,比这个代码少多了
回复 使用道具 举报

也是,受教了:)
回复 使用道具 举报
沿途小将 发表于 2014-8-16 11:14
这个思路,确实是能提高很多,我该向你学习

:):):handshake:handshake
回复 使用道具 举报
嘿~~ 发表于 2014-8-16 11:17
直接给内外循环加标记,我自己做的,比这个代码少多了

怎么个标记法?
回复 使用道具 举报

W:for (; ; )//W是外层循环标记
{
        Q:for (; ; )//Q是外层循环标记
        {
                break Q;//表示在此处中断内层循环
                break W;//表示在此处中断外层循环
                //也可以用continue,
                //以上语句可以定义在循环体的任何地方
        }
}
回复 使用道具 举报
嘿~~ 发表于 2014-8-16 11:41
W:for (; ; )//W是外层循环标记
{
        Q:for (; ; )//Q是外层循环标记

那我只能:lol:lol
回复 使用道具 举报
大神果然很多啊.
回复 使用道具 举报
fantacyleo 发表于 2014-8-15 22:49
太麻烦了:
1. 没有必要统计余数等于零的个数
2. 没有必要让X对1到他自己(X)取余

还有改进的余地,可以参考这个:http://blog.csdn.net/program_think/article/details/7032600/
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马