返回信息流第一题,一个数拆成连续几个自然数之和,给出所有拆法
第二题,两个有序数组,长度分别为N,M,相互之间两 两相加,得到N*M的数组,求其中第K大的那个数
转自 winton
这是一条镜像帖。来源:北邮人论坛 / soft-design / #34374同步于 2009/5/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[分享] 有道面试题
Jarod
2009/5/11镜像同步35 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
1:
def chai(n):
for low in range(n+1):
for high in range (low,n+1):
if (low+high)*(high-low+1) == n:
print range(low,high+1)
如果需要优化效率,内层循环可以用二分查找。
2:
给两个数组建“堆”,每次从堆顶取两个相乘
(不太好的方法,还是要O(N*M),如果k很大)
其实小包弄了第一题,jarod弄了第二题,尤其是第二题......
【 在 wks 的大作中提到: 】
: 1:
: def chai(n):
: for low in range(n+1):
: ...................
第二题怎么与乘相关了??
【 在 wks 的大作中提到: 】
: 1:
: def chai(n):
: for low in range(n+1):
: ...................
第一题多简单
简单直接的办法 for(x:N) test n-sum(x)/x==0
zhuangB用的办法 producer/consumer模型
先把{n}放进工作队列 工作线程取出n 然后把{1,n-1} {2,n-2} ....{n/2-1,n/2+1}放进去
如果{x,n-x}是连续数就放进结果队列 小于0的就扔掉
然后工作线程继续取出 {x,n-x} 把n-x换算成 {x+1,n-x-(x+1)}
依次操作。。。。结束条件是工作队列为空
应用并行计算可在单位时间里计算任意大小数
【 在 Jarod (3线操作失败男 | 天天被雷劈) 的大作中提到: 】
: 小包有弄第一题么??
...用毛的除法
【 在 coolwc 的大作中提到: 】
: 第一题多简单
: 简单直接的办法 for(x:N) test n-sum(x)/x==0
: zhuangB用的办法 producer/consumer模型
: ...................
【 在 Jarod 的大作中提到: 】
: 第一题,一个数拆成连续几个自然数之和,给出所有拆法
: 第二题,两个有序数组,长度分别为N,M,相互之间两 两相加,得到N*M的数组,求其中第K大的那个数
: 转自 winton
第一题,第一届百度之星2005年初赛第一题,同时被编程之美收录
下面是我的代码,并不是最高效的
#include<iostream>
#include<cmath>
using namespace std;
//2n=(2b+l-1)*l 用的就是这条公式,如果对2n做因式分解之后枚举所有因子的话,应该更加高效,注意的是 l<2b+l-1
int main(void)
{
int n,l,b,k;
scanf("%d",&n);
if((n&(n-1))==0)
printf("NONE\n");
else{
n*=2;
for(l=(int)sqrt((double)n);l>1;l--){
if(n%l!=0)
continue;
k=n/l;
if(k<=l||((k-l)&1)==0)
continue;
b=(k-l+1)>>1;
for(int i=0;i<l-1;i++)
printf("%d ",i+b);
printf("%d\n",b+l-1);
}
}
system("pause");
return 0;
}