找回密码
 欢迎注册
查看: 16053|回复: 13

[擂台] 编程之美2.21 只考加法的面试题

[复制链接]
发表于 2009-10-9 14:49:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我们知道:
1+2=3
4+5=9
2+3+4=9
等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这样的形式呢?稍微考虑一下,我们发现,4、8等数并不能写成这样的形式。

【问题1】写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。

【问题2】大家在测试上面程序的过程中,肯定会注意到一些数字不能表达为一系列连续的自然数之和,例如32好像就找不到。那么,这样的数字有什么规律呢?能否证明你的结论?

【问题3】在64位正整数范围内,子序列数目最多的数是哪一个?这个问题要用程序蛮力搜索,恐怕要运行很长时间,能否用数学知识推导出来?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-9 17:59:23 | 显示全部楼层
这个问题比较简单.我怎么记得这里问过的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-9 22:32:31 | 显示全部楼层
$a(n+1)+(n(n+1))/2$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-10 08:00:31 | 显示全部楼层
记录学习
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-13 09:57:00 | 显示全部楼层
本帖最后由 tprime 于 2009-10-13 10:03 编辑

这题很简单的, POJ上有到类试题

int main( )
{
        int n,w;
        while(scanf("%d",&n) == 1)
        {
                while (n%2 == 0)
                        n >>= 1;
                if(n == 1)
                {
                        w = 1;
                        continue;
                       //无解条件: n &(n -1) == 0
                }
                w = 2;
                int s = sqrt(n);
                for(int i = 3; i < s + 1; i += 2)
                        if(n%i == 0)
                                w += 2;
                if(s * s == n)
                        w--;
                printf("%d\n",w);
        }
        return 0;
}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-13 10:01:52 | 显示全部楼层
上面只计算的分解的组数,简单改改
能满足题目的要求, 此题的复杂度是O(n^1/2)

最难的第3问,需要质因数快速分解算法,进行枚举
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-13 21:18:33 | 显示全部楼层
任何奇数都可以 2n+1 =n+(n+1)
如果是偶数,必须是3的倍数,6n=2n-1+2n+2n+1
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-13 22:27:55 | 显示全部楼层
第三问显然要通过使用构造法.要让n有尽量多的奇数因子(不大于${sqrt(1+8n)+1}/2~=sqrt(2n)$),这个至少可以通过线性规划来做.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-14 10:23:14 | 显示全部楼层
要使n的因子个数尽量多
不妨设 n的最大素因子maxfactor 为 (5,7,11,13,17) 中的一个
进行枚举
n = 3^p1 * 5^p2 * 7^p3 * ... maxfactor^pn
满足 n < 2^64,  然后算出p1,p2, ...pn的所有组合
再进行判断
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-10-14 11:56:56 | 显示全部楼层
任何奇数都可以 2n+1 =n+(n+1)
如果是偶数,必须是3的倍数,6n=2n-1+2n+2n+1
〇〇 发表于 2009-10-13 21:18


10=1+2+3+4
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-26 11:34 , Processed in 0.069277 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表