免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liuke432
打印 上一主题 下一主题

1 2 5三个数相加等于1000,共有多少种情况?要求行数 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-25 10:24 |只看该作者
原帖由 converse 于 3/24/07 23:33 发表
保留本帖,方便查找。


  1. 其实这个方法并不具有一般性, 因为集合{a_i}, 0 <= i < m, 中存在一个a_k, 使得 a_k | a_i, 0 <= i < m,
  2. 这里a_k = 1.
复制代码

一般的有限正整数集合的话, 生成函数才是王道...

论坛徽章:
0
12 [报告]
发表于 2007-03-25 19:03 |只看该作者
ArXoR 是学数学的?

论坛徽章:
0
13 [报告]
发表于 2007-03-26 02:14 |只看该作者
for(i=1;i<200;i++)
    count+=(int)((1000-5*i-1)/2);



其实这里因为是 整数除法 所以强制转换 (int) 可以不要

[ 本帖最后由 njmarshal 于 2007-3-26 02:30 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-03-26 11:06 |只看该作者
原帖由 liuke432 于 2007-3-24 19:15 发表


恩 明白了   厉害!

这样就可以了


  1.       for(i=1;i<200;i++)
  2.          count+=(1000 - 5i)/2+1;

复制代码


没注意边界值

论坛徽章:
0
15 [报告]
发表于 2007-03-26 11:17 |只看该作者
原帖由 hake2000 于 2007-3-26 11:06 发表


没注意边界值



  1. for(k=1;k<200;k++)
  2. {
  3.     count2+=(1000 - 5*k -1)/2;
  4. }

复制代码

此时count2的结果为 0xc1c1




  1. for(k=1;k<200;k++)
  2. {
  3.     count2+=(1000 - 5*k)/2;
  4. }
复制代码


此时count2的结果为 0xc224


百思不得其解,这两种情况结果应该相同亚。难道是我对除法运算还没弄明白???
郁闷

论坛徽章:
0
16 [报告]
发表于 2007-03-26 11:19 |只看该作者
原帖由 hake2000 于 2007-3-26 11:17 发表




  1. for(k=1;k<200;k++)
  2. {
  3.     count2+=(1000 - 5*k -1)/2;
  4. }

复制代码

此时count2的结果为 0xc1c1




  1. for(k=1;k<200;k++)
  2. {
  3.     count2+=(1000 - 5*k)/2;
  4. }
复制代码


此 ...


编译环境是gcc 3.2.2

论坛徽章:
0
17 [报告]
发表于 2007-03-26 11:35 |只看该作者
终于知道了,晕
低级失误亚!!! 一直以为 (1000 - 5*k)是奇数!!!!!!!!!!!!

论坛徽章:
0
18 [报告]
发表于 2007-03-26 11:37 |只看该作者
原帖由 hake2000 于 2007-3-26 11:19 发表


编译环境是gcc 3.2.2




  1. for(k=1;k<200;k++)
  2. {
  3.     count2+=(1000 - 5*k)/2;
  4. }

复制代码



零个1的情况是不应该算的

论坛徽章:
0
19 [报告]
发表于 2007-03-26 13:09 |只看该作者
原帖由 liuke432 于 2007-3-23 22:29 发表
1  2  5三个数相加等于1000,共有多少种情况?
要求行数。

写了一个三行的

for(i=1;i<500;i++)
  for(j=1;j<200;j++)
    if((i*2+j*5)<1000)count++;

面试官说可以两行实现,请各位高手指 ...


从上面的代码可以看出题目的要求是"1" ,"2","5"分别至少要有 1 个

所以我们的代码可以这样写

  1. // a c 可以为"2","5"任何一个
  2. // b=1
  3. // 原来的考虑有点欠缺
  4. // 1 是很特殊的数字。任何正整数都可以用多个1相加得到
  5. //  so  b must be 1
  6. //                   ok?
  7. //  但 a,b,c 不能相等
  8. for(i = a ; i<1000 ; i+=a)  //i=a是保证至少有一个a
  9.            count += (1000-i-b) /c;  //减去b是保证至少有一个b
  10.                                  //除以c则反映出a,b组成1000-i的b,c合法组数

复制代码



或者下面这样的代码也可以
但不如上面的好

  1. // a,c=2,5 or a,c=5,2
  2. b=1
  3. for(i = 1 ; i<1000/a ; i++)
  4.         count += (1000 - i*a -b) /c;     
复制代码


比如a=5  b=1 c=2就成了我上面的一个帖子代码
见13楼
原帖由 njmarshal 于 2007-3-26 02:14 发表

  1. for(i=1;i<200;i++)
  2.     count+=(int)((1000-5*i-1)/2);
复制代码



其实这里因为是 整数除法 所以强制转换 (int) 可以不要

[ 本帖最后由 njmarshal 于 2007-3-26 17:40 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2007-03-26 13:40 |只看该作者
原帖由 njmarshal 于 3/26/07 13:09 发表


从上面的代码可以看出题目的要求是"1" ,"2","5"分别至少要有 1 个

所以我们的代码可以这样写
[code]
// a b c 可以为"1","2","5"任何一个 ...


不知道你在写什么, 我觉得你似乎没有明白为什么可以这样算.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP