发个题目大家娱乐一下

绿色夹克衫 2013-04-03 03:48:48
加精
有N个Int32范围内的正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。N可能会达到5w规模。问题不涉及什么高深的知识,所以比较适合讨论。
...全文
14601 225 打赏 收藏 转发到动态 举报
写回复
用AI写文章
225 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystaldn 2013-05-07
  • 打赏
  • 举报
回复
这一段看晕了,求解释: for (int mask = 1; mask < (1 << factors.Count); mask++) { int product = 1; for (int i = 0, bits = mask; i < 32 && bits > 0; i++, bits >>= 1) { if ((bits & 1) == 1) product *= factors[i]; } result.Add(product); }
GreyAnts 2013-05-03
  • 打赏
  • 举报
回复
是不是 sqrt(n)??
_流浪者 2013-04-30
  • 打赏
  • 举报
回复

  private int MaxValue(int[] a)
        {
            int max = 0;
            for (int i = 0; i < a.Length - 1; i++)
            {
                for (int j = i + 1; j < a.Length; j++)
                {
                    int n = suv_div(a[i], a[j]);
                    if (max < n)
                        max = n;
                }
            }
            return max;
        }

        int suv_div(int p, int q)
        {
            int r = q % p;
            if (r == 0)
            {
                return p;
            }
            return suv_div(r, p);
        }
xiaokangs 2013-04-23
  • 打赏
  • 举报
回复
速度啊,我很好奇结果会什么思路
u010420002 2013-04-23
  • 打赏
  • 举报
回复
路过 浮起 潜水
clarks1980 2013-04-22
  • 打赏
  • 举报
回复
可以使用,非常不錯!
dq9005 2013-04-20
  • 打赏
  • 举报
回复
谨记妳の容颜 2013-04-19
  • 打赏
  • 举报
回复
表示刚开始学。
逍遥jc 2013-04-19
  • 打赏
  • 举报
回复
应该是求最大公约数的办法吧。能不能把前面的最大公约数和下一个数比较。这个方案不知道可不可行。
wang6shuai 2013-04-19
  • 打赏
  • 举报
回复
新手,没什么好方法,用最笨的,每两个数求出最大公约数,放入一个数组,最后在遍历数组,得到数组中的最大值。
神马都能聊 2013-04-17
  • 打赏
  • 举报
回复
要讨论,可以让大家把时间和空间复杂度都附在代码后面。 个人觉得直接逐个循环求最大公因数,将最大公因数存在变量里,然后与新计算出的最大公因数比较大小。 这个就是比较的损耗可能大些,其它的可能还好。
vvind 2013-04-17
  • 打赏
  • 举报
回复
土土的实现方式。 发现最大耗时点在于分解每个数的质因数上。 原因是,如果5W数中存在很大的素数,那么确认他的确是个素数花了很长时间。 其他部分耗时忽略不计了。 static void Main(string[] args) { Console.Write("请输入N值:"); int N = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("N={0}", N); //生成N个随机数 Random r = new Random(2013); List<int> intArray = new List<int>(N); for (int i = 0; i < N; i++) { intArray.Add(r.Next(int.MaxValue)); } //开始计时 DateTime startTime = DateTime.Now; Console.Write("step1:分解质因数。耗时"); //对所有的数分解质因数,很大的优化空间 HashSet<int> hsdivList = new HashSet<int>(); foreach (int num in intArray) { int number = num; for (int i = 2; i<number; i++) { if (number % i == 0) { number = number / i; if (!hsdivList.Contains(i)) hsdivList.Add(i); i = 2; } } } Console.WriteLine((DateTime.Now - startTime).TotalMilliseconds); Console.Write("step2:质因数排序。耗时"); //质因数排序 List<int> divList = new List<int>(hsdivList.Count ); foreach (int i in hsdivList) { bool ifInsert = false ; for (int j = 0; j < divList.Count; j++) { if (divList[j] < i) { divList.Insert(j, i); ifInsert = true; break; } } if (!ifInsert) divList.Add(i); } Console.WriteLine((DateTime.Now - startTime).TotalMilliseconds); Console.WriteLine("质因数列表:"); foreach (int i in divList) Console.Write(i + ","); Console.WriteLine(); Console.WriteLine("step3:搜索:"); int maxDiv = 0; int numA=0; int numB =0; //开始尝试是否有两个以上随机数包含最大公约数 foreach (int i in divList) { bool ifGetA = false; for (int j = 0; j < N; j++) { if (ifGetA) { if (intArray[j] != numA && intArray[j] % i == 0) { //由于从大到小查找I,所以只要找到一次就够了。 numB = intArray[j]; maxDiv = i; break; } } else { if (intArray[j] % i == 0) { ifGetA = true; numA = intArray[j]; } } } if (maxDiv > 0) break; } Console.WriteLine("数对为{0},{1}", numA, numB); Console.WriteLine("最大公因数为{0}", maxDiv); Console.WriteLine("总耗时", (DateTime.Now - startTime).TotalMilliseconds); Console.ReadLine(); }
有用的鱼 2013-04-17
  • 打赏
  • 举报
回复
计算机专业本科大三的专业问题
有用的鱼 2013-04-17
  • 打赏
  • 举报
回复
计算机专业的基础性问题吧
bbwolf 2013-04-16
  • 打赏
  • 举报
回复
gomoku的算法还可已优化一下,代码我看了4遍才看懂。。。 正如gomoku所说确实资源占用很大。
guguai 2013-04-16
  • 打赏
  • 举报
回复
引用 237 楼 kuafuzhuguang 的回复:
设x为a与b的最大公约数,c为a%b,当a>=b则一定满足a>=b>=c>=x 此时a与b的最大公约数等价于b与c的最大公约数。 所以现将数组an进行堆排序,取出堆顶两个数进行求余。 如果c不为0则将b和c放入堆中然后循环 否则b则为答案 这个应该也挺快的吧。。。 不知道算法有没有问题
举个特例: 如果a是b的倍数且b>0,则x=b, c=a%b=0, 哪来的 c>=x ?
bbwolf 2013-04-15
  • 打赏
  • 举报
回复
题目本身没描述清楚,两两之间是指顺序两两还是全部两两,这两种算法是不同的
u010299383 2013-04-15
  • 打赏
  • 举报
回复
夸父逐光 2013-04-14
  • 打赏
  • 举报
回复
设x为a与b的最大公约数,c为a%b,当a>=b则一定满足a>=b>=c>=x 此时a与b的最大公约数等价于b与c的最大公约数。 所以现将数组an进行堆排序,取出堆顶两个数进行求余。 如果c不为0则将b和c放入堆中然后循环 否则b则为答案 这个应该也挺快的吧。。。 不知道算法有没有问题
夸父逐光 2013-04-14
  • 打赏
  • 举报
回复
设x为a与b的最大公约数,当a>=b则一定满足a>=b>=a%b>=c 此时a与b的最大公约数等价于b与c的最大公约数。 所以现将数组an进行堆排序,取出堆顶两个数进行求余。 如果c不为0则将b和c放入堆中然后循环 否则b则为答案 这个应该也挺快的吧。。。 不知道算法有没有问题
加载更多回复(205)
前台后台登陆帐号和密码都是: Login:admin password:123456 后台管理的投票管理密码是: password:123456 其余的插件管理都是管理员进入该插件后直接管理,无须密码! 即时聊天的默认管理是:“超管”。如想修改其他人为管理,可打同学录目录下的jsl.asp,找到"guanli="超管""这一行,将超管这个的名字修改为你想要做管理的人名字即可,如想加多位管理,请以,分开。注意,填入的名字是注册后的真实名字,而不是登陆帐号。 后台有部分管理连接由于尚未修改成功,所以并未添加其功能,大家点击后会出现无法显示的提示,这是正常的。出错的连接项目为:音乐列表管理、VIP管理、数据库后台管理、绿色联盟升级导航系统。 本同学录主要功能: 1.风格可以变化,即换即用! 2.个人形象设计,可以利用在同学录里发帖子发留言赚得的货币在虚拟商店内买心仪的服饰装扮虚拟形象,而且打扮好后,还可以和其他同学的虚拟形象一起合影留念。并且在班级留言的时候会在留言旁边显示出自己的形象设计。个人形象设计在登陆名字后出现的小人图案下会有一个“我的虚拟形象”可以点击该连接进入,或者在班级主页顶端的菜单--个人菜单--形象设计也可以进入。 3.娱乐休闲的在线小游戏请你来找茬,这个游戏应该没有人会不知道吧?呵呵,在班级主页顶端的菜单--班级社区--请你找茬可以点击进入该游戏,一共有205道题目。 4.在线即时聊天,这个我不再多说,明眼一看就知道怎么回事了。 5.班级投票,在班级主页右下角的位置,可以方便用来统计大家的意见的。 6.在线随机播放歌曲,进入同学录后,可以随机听到好多歌曲,如果网速慢的可以在主页顶左边位置切换到无音乐版本的同学录。一共740首歌曲,连接基本都是有效的,因为多人共享这些音乐程序,所以有时候会发现一些歌曲不能听,下一次就能听了。 7.娱乐休闲的在线小游戏成语接龙,在班级主页顶端的菜单--班级社区--成语接龙可以点击进入该游戏。 8.外贸银行,钱多了可以存到银行来哦,银行会每天支付一定比例的利息,注意,如果想在大富翁排行榜就请不要存那么多钱了!因为存了钱是不能算现金排行的!在班级主页顶端的菜单--班级社区--外贸银行可以点击进入该银行。 9.娱乐休闲的在线小游戏泡泡龙,在班级主页顶端的菜单--班级社区--泡泡龙可以点击进入该游戏。 10.娱乐休闲的祈愿祝福,在班级主页顶端的菜单--班级社区--祈愿祝福可以点击进入。 11.娱乐休闲的每日星运,在班级主页顶端的菜单--班级社区--每日星运可以点击进入。 12.娱乐休闲的海边钓鱼,在班级主页顶端的菜单--班级社区--海边钓鱼可以点击进入。 13.娱乐休闲的开心词典,在班级主页顶端的菜单--班级社区--开心词典可以点击进入。

110,569

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧