线程优化大赛7月的题目-相亲数!

denghui0815 2008-07-06 12:03:11
对于一对不相同的整数,如果其中一个整数的正约数(proper divisors)之和等于第二个整数,且反之亦然,那么这对整数便可称之为一对“相亲数”(amicable numbers)。

示例:220, 284
220=2^2*5*11 (1+2+4+5+10+11+20+22+44+55+110 = 284)
284=2^2*71 (1+2+4+71+142 = 220)

请考虑一个自然数的各约数之和与该数本身的比率,即 R(n)。如果两个不相同的自然数的比率相等,那么这样的数称为一对“亲和数”(friendly numbers)。

示例:30, 140
R(30) = (1+2+3+5+6+10+15+30)/30 = 12/5
R(140) = (1+2+4+5+7+10+14+20+28+35+70+140)/140 = 12/5

问题:编写一个线程应用程序来查找并打印出每一对相亲数与亲和数,它们均在给定的输入范围内。在应用程序开始执行时,这个范围(两个正整数)会以命令行参数的形式赋予该应用程序。

输入与输出示例:

> amicable.exe 200 600
220 和 284 是相亲数
240 和 600 是亲和数

限制:不可以将直接知识或信息编码到源文件或应用程序使用的辅助文件中。例如,不可以使用质数(prime numebrs)表或是相亲数或亲和数列表。所有这些信息都必须由应用程序在运行时生成。

计时:以时钟时间(Wall-clock time)为准(包括输入输出时间,即I/O时间)
...全文
321 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
denghui0815 2008-07-26
  • 打赏
  • 举报
回复
jfguo:

我的测试机器是dell 1400的双核笔记本
CPU: One Intel(R) Core(TM)2 Duo CPU T5270 @ 1.40GHz
L2 cache : 2 MB, 8-Way, 64 byte lines
Bus speed : 667 MHz

我的测试结果跟你相同
0 5000000 1.4*s
5000000 10000000 1.4*s
1000000000 1010000000 3.*s
4000000000 4010000000 3.*s
239000000 259000000 6.*s
shizhixiang 2008-07-25
  • 打赏
  • 举报
回复
jfguo:
等比赛结束后,能把你的作品放在网上,供我学习一下吗?我还没见过这么快的处理速度。
jfguo 2008-07-25
  • 打赏
  • 举报
回复
shizhixiang,
1. 主页的题目描述中最后给了两个数的范围,32bit的整数。
2. 没有规定必须用Intel的cpu,但最终测试时用的是Intel的cpu。
3. 一个数大概需要16个byte,5000000需要大概80M。
4. 对,是机器有四个物理核(双XEON5110)的时间。
shizhixiang 2008-07-25
  • 打赏
  • 举报
回复
to jfguo:
请教几个问题:
1,比赛题有规定两个数的取值范围吗?
2,比赛题规定了必须用Intel的cpu吗?如果没有,我估计你的程序在AMD的机子上跑不起来。
3,查找亲和数 需要大量的内存来保存临时数据的,你的电脑能为5000000个数求亲和数提供足够的内存吗?这一个问题你是怎么解决的?
4,0 5000000
0m1.072s
------------这是说两个数0-5000000,用时只有1.072秒?
jfguo 2008-07-24
  • 打赏
  • 举报
回复
denghui0815, 你最后的结果有多快。
记得你的机器是Core 2 Duo的,
一直没有用过Core 2 Duo的机器,
不知道与XEON和P4相比能快多少。
jfguo 2008-07-24
  • 打赏
  • 举报
回复
denghui0815, 你最后的结果有多快。
记得你的机器是Core 2 Duo的,
一直没有用过Core 2 Duo的机器,
不知道与XEON和P4相比能快多少。
jfguo 2008-07-24
  • 打赏
  • 举报
回复
四线程的结果

0 5000000
0m1.072s

5000000 10000000
0m1.028s

1000000000 1010000000
0m2.717s

4000000000 4010000000
0m3.043s

239000000 259000000
0m4.921s
jfguo 2008-07-24
  • 打赏
  • 举报
回复
晚上比赛就结束了,贴个我的结果对一对吧。

范围
amiable
friendly
2线程的时间 (XE5110)

0 5000000
71
96249
0m1.634s

5000000 10000000
26
2510
0m1.559s

1000000000 1010000000
1 (1002455350 and 1005541130 are AMICABLE)
0
0m4.156s

4000000000 4010000000
1 (4000783984 and 4001351168 are AMICABLE)
0
0m4.280s

239000000 259000000
3
28
0m7.593s
denghui0815 2008-07-19
  • 打赏
  • 举报
回复
估计是能运行的 当效率太低了。
如果计算0到5000000之间的 你的代码可能超过10秒
我目前在双核上能到2秒内
zpyzjj 2008-07-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <cmath>
using namespace std;
int dsum(int n)
{
int sum=1;
for(int i=2;i<sqrt(n);i++)
if(n%i==0)
sum+=i+n/i;
return sum;
}
int main()
{
int a,b,i=0,q=0;
cin>>a>>b;
int *list=new int[b-a+1];
for(i=0;i<b-a+1;i++)
list[i]=dsum(a+i);
for(i=0;i<b-a;i++)
{
if(dsum(list[i])==a+i&&a+i<list[i])
cout<<a+i<<" 和 "<<list[i]<<" 相亲数 "<<endl;
for(q=1+i;q<b-a+1;q++)
if(list[i]*(a+q)==list[q]*(a+i))
cout<<a+i<<" 和 "<<a+q<<" 亲和数 "<<endl;
}
return 0;
}

大哥 代码是不是这样就行了?? 难道这样就能提交?? 也没什么线程。。。。。不懂哇
denghui0815 2008-07-17
  • 打赏
  • 举报
回复
是啊 排序题完了后他就消失了
最近为奥运门票 焦头烂额了 老爸要看篮球
haojn 2008-07-16
  • 打赏
  • 举报
回复
不客气!
要是zm001杀回来就太有戏剧性了
haojn 2008-07-15
  • 打赏
  • 举报
回复
恭喜LZ得到4核!MBA也已经是势在必得了:)

我过两天出远门,这月的题没有时间做了。
感谢各位参与竞赛讨论的朋友,在与大家的交流中我学到了很多新的东西!
denghui0815 2008-07-15
  • 打赏
  • 举报
回复
:) 谢谢佳男
还有最后一题 我会尽全力的.
历史通常会相似 不知道zm001会不会在最后一题回来.
denghui0815 2008-07-14
  • 打赏
  • 举报
回复
3G内存 大概能处理2-4亿的区间
jfguo 2008-07-12
  • 打赏
  • 举报
回复
对输入的范围,ClayB在英文网站给了一个解释。


" YurySerdyuk:

Does you mean that under

>AmicableNumbers.exe <from> <to>

( to - from ) * 16 fits into the (physical) memory ?

Yury

Yes, that is a good assumption. With 4GB of physical memory, we might assume 3GB available. This would mean over 200 million four integer (16 bytes) records could be stored. That seems more than sufficient to differentiate execution times for entries (and could potentially present the judges with an over abundance of output to judge).

Memory management shouldn't be part of the exercise, unless it is specifically stated as part of the problem. However, if you are extremely inefficient with memory management such that you had the only application that could not handle the largest data set input, the judging would render your application with a lower execution score. On the other hand, if your application is the only one to handle a large data set that the judges thought was reasonable, that data set would likely be removed from the judging criteria, but your application would be given a bonus for being an example of better memory management.

--clay"
jfguo 2008-07-10
  • 打赏
  • 举报
回复
题目没说输入的两个整数的范围,不知道需不需要考虑大于2^32的数。
也没说两个数的差,如果两个数的差很大的话就没法来保存临时数据了。
这样的话,就需要遇到一个数就求一次约数之和,会很慢。
denghui0815 2008-07-10
  • 打赏
  • 举报
回复
已经说明了是在4字节的int范围内
我猜测两个数的差不会太大 10000000 - 400000000
否则测试大家的程序 很多会超过120秒
denghui0815 2008-07-08
  • 打赏
  • 举报
回复
感觉国内学术界把相亲数和亲和数混为一谈了.
haojn 2008-07-08
  • 打赏
  • 举报
回复
wiki上对两个的定义跟题目是一致的
加载更多回复(5)

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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