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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李奔 中级黑马   /  2013-6-10 10:46  /  3271 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李奔 于 2013-6-11 20:45 编辑

既然大家都这么热情,那就再给大家分享一道:
在label控件中随机输入20个1~1000之间的整数,求出其中所有的素数的和。
大家看看...

15 个回复

倒序浏览
这道题的难点估计就是如何判断一个数它是不是一个素数,素数就是只能被1和它本身整除的数、
bool b=true; //定义一个布尔进行判断
for (int i = 2; i < a; i++)
            {
                if (a%2==0||a%3==0)
                {
                    b = false;  
                    break;
                }
            }
            if (b)
            {
                Console.WriteLine("{0}是素数",a);
            }
            else
            {
                Console.WriteLine("{0}不是",a);
            }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报 1 0
素数判断出来了那相加就简单了
回复 使用道具 举报
ljh4282158 发表于 2013-6-10 11:24
这道题的难点估计就是如何判断一个数它是不是一个素数,素数就是只能被1和它本身整除的数、
bool b=true;  ...

你这个不靠谱,5,7,11,13,17,19的倍数带入进去,都会判断是素数
回复 使用道具 举报
274997322 发表于 2013-6-10 12:30
你这个不靠谱,5,7,11,13,17,19的倍数带入进去,都会判断是素数

不会啊、比如 10  14  26 34 38 判断的都不是素数,不过有点BUG 3判断的不是素数
回复 使用道具 举报
我不知道怎么向lable里添加数字,所以就谢了个控制台的

   int[] su = new int[10];
            int[] num = new int[10];
            Console.WriteLine("请连续输入10个数1-1000的整数,用空格隔开");
            string strNum = Console.ReadLine();
            string[] str=strNum.Split(' ');
            for (int i = 0; i < str.Count(); i++)
            {
                num[i] = Convert.ToInt32(str[i]);
            }

            for (int i = 0; i < num.Count(); i++)
            {
                int count = 0;
                for (int j = 2; j <= Math.Sqrt(num[i]); j++)
                {
                    if (num[i] % j == 0)
                    {
                        count++;              
                    }
                }

                if (count == 0)
                {
                    su[i] = num[i];
                }            
            }

            Console.WriteLine("其中素数是:");
            int sum=0;
            for (int i = 0; i < su.Count(); i++)
            {
                Console.Write("{0} ", su[i]);
                sum += su[i];
            }
            Console.WriteLine();
            Console.WriteLine("素数和为:" + sum);           
            Console.ReadKey();

QQ截图20130610132250.jpg (17.27 KB, 下载次数: 0)

QQ截图20130610132250.jpg

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
274997322 发表于 2013-6-10 13:22
我不知道怎么向lable里添加数字,所以就谢了个控制台的

   int[] su = new int[10];

int a ;
lable.text = a;
直接赋值就可以了
回复 使用道具 举报
ljh4282158 发表于 2013-6-10 12:42
不会啊、比如 10  14  26 34 38 判断的都不是素数,不过有点BUG 3判断的不是素数 ...

你看55,35,是不是素数,还是老实的递归好些
回复 使用道具 举报
李奔 中级黑马 2013-6-10 16:55:22
9#
顺便把我的程序也附上吧!
  1.     //实例化随机数
  2.             Random r = new Random();
  3.             //保存素数的和
  4.             int sum = 0;
  5.             Console.WriteLine("这20个随机数为:");
  6.             for (int i = 1; i <= 20; i++)
  7.             {
  8.                 //随机产生1~1000之间的随机数
  9.                 int n = r.Next(1, 1001);               
  10.                 //把值加入到label1中
  11.                 txtShuzi.Text+= Convert.ToString(n) + "   ";

  12.                 int j;
  13.                 //素数判断
  14.                 for ( j = 2; j <= n/2; j++)
  15.                 {
  16.                     if (n % j != 0)
  17.                     {
  18.                         continue;
  19.                     }
  20.                     else
  21.                     {
  22.                         break;
  23.                     }
  24.                 }
  25.                 if (j > n / 2)
  26.                 {
  27.                     txtSushu.Text += n + "    ";
  28.                     sum += n;
  29.                 }
  30.             }
  31.             label1.Text = Convert.ToString(sum);
复制代码
仅供参考!

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
愁死我了,为什么我写出来的是,调试的时候出来的结果是20个不同的数,运行的时候就是20个同样的数。
  1. private void btNew_Click(object sender, EventArgs e)
  2.         {
  3.             int sum=0;
  4.             
  5.             int i = 0;
  6.             do
  7.             {
  8.                 int j = 0;
  9.                 Random ra = new Random();
  10.                 int ra1 = ra.Next(1, 1000);
  11.                 for (j = 2; j <ra1; j++)
  12.                 {
  13.                     if (ra1 % j == 0)
  14.                     {
  15.                         break;
  16.                     }

  17.                 }
  18.                 if(j==ra1)
  19.                 {
  20.                     lbnew.Text += Convert.ToString(ra1) + ",";
  21.                     sum += ra1;
  22.                     i++;
  23.                 }

  24.             }
  25.             while (i <20);
  26.             lbSum.Text = Convert.ToString(sum);
  27.         }
复制代码

调试.png (44.95 KB, 下载次数: 0)

调试.png

运行.png (33.62 KB, 下载次数: 0)

运行.png

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
蔓越莓 发表于 2013-6-10 21:39
愁死我了,为什么我写出来的是,调试的时候出来的结果是20个不同的数,运行的时候就是20个同样的数。 ...

是random 的问题。它只循环了一次。然后赋值给了每个lable
回复 使用道具 举报
蔓越莓 发表于 2013-6-10 21:39
愁死我了,为什么我写出来的是,调试的时候出来的结果是20个不同的数,运行的时候就是20个同样的数。 ...

首先这个答案的貌似和题不对应,问题是:随机生成整数,挑选是素数的求和。看了一下代码,貌似你的答案是:随机生成数字,是素数的记录下来,进行累计,累积到达20后,求和。
其次:生成随机数的声明,是不是应该放到循环外面。在里面调用。如果不是放到外面,那么就和楼上说的一样。随机数有个“随机种子”的概念,如果这样定义,随机种子一样,那么随机生成的数字也是一样的。
回复 使用道具 举报
什么是素数?
回复 使用道具 举报
haxyek 发表于 2013-6-11 10:36
首先这个答案的貌似和题不对应,问题是:随机生成整数,挑选是素数的求和。看了一下代码,貌似你的答案是 ...

果然把random放在外面就好了
回复 使用道具 举报
搞得那么复杂干啥
  1. //定义一个方法 是否返回质数
  2.         public static bool ZhiShu(int number)
  3.         {
  4.             for (int i = 2; i < number; i++)
  5.             {
  6.                 if (number % i == 0)
  7.                 {   //上面的条件一旦城里说明被2和本身-1的数除尽了,不是质数,返回false
  8.                     return false;
  9.                 }
  10.             }
  11.             //循环执行完毕,也就说明上面的条件都不成立,说明是一个质数,返回true
  12.             return true;
  13.         }
复制代码
回复 使用道具 举报
如果单纯针对这个题目的话,看能不能这样:
本身1-1000之间的素数个数就不会太多,所以,如果我预先运算出所有1-1000之间的素数,将他们放入一颗平衡树的集合中,然后随机生成的20个数,通过查表法判定是否出现在这个素数集合中,确定是否需要将改数求和.相较于对随机数每一次都做素数判定,上面的方式时间复杂度可能会低很多.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马