Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826444
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-17 14:39:17

1  2  5三个数相加等于1000,共有多少种情况?
要求行数。

写了一个三行的

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

面试官说可以两行实现,请各位高手指点指点!
 
这样是我的第一反应:
for(i=1;i<500;i++)
  for(j=1;j<200&&(i*2+j*5)<1000;j++)
    count++;
 
可惜不对,结果算算任意一个数有1,2构成的个数...,我这里是1,2必须出现一次,1,2可以不出现又有点不同,大家可以推导下,过程类似:
 
  1 --- 0
  2 --- 0
  3 --- 1
  4 --- 1
  5 --- 2
  不写了(n-1)/2最后的结果
 
 
 验证下,下面的程序有些许的意淫的技巧,大家千万别拍砖!!!
   

#include <stdio.h>
#include <stdlib.h>

int count1(int num)
{
  int i;
  int j;
  int count = 0;
  
  int num1 = num-3;
  int num2 = num-6;
  
  for(i=5; i<=num1; i+=5)
   for(j=2;j<=num2;j+=2)
    {
     if( i+ j < num)
       count++;
    }
    
   return count;
}

int count2(int num)
{
  int i;
  int j;
  int count = 0;
  
  int num1 = num-3;
  
  for(i=5; i<=num1; i+=5)
    {
     count += (num -i -1 )/2;
    }
    
   return count;
}
 
int main(int argc, char *argv[])
{
    
  printf("total:%d\n",count1(1000));
  printf("total:%d\n",count2(1000));
  system("PAUSE");    
  return 0;
}

阅读(2666) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

kentzhou2009-08-29 10:55:43

给定5的个数,1000-5i拿来除2得到对应的2的选择数 for (i = 0; (1000 - 5*i)>=0; i++) sum+= (1000 - 5*i)/2 + 1;

chinaunix网友2009-08-23 01:19:05

回去又想了一下。 如果想法正确的话,通用情况或许可以按 n(x) = n1(x-1) + n2(x-2) + n3(x-3) + …… + nm(x-m)…… 来计算。 其中nm(x-m)这个式子的计算法可以参照上边的n(x-5),那个n(x-5)实际上是n5(x-5)。如果没有对应的m项,则空出。 但没有做过测试,太麻烦了。

chinaunix网友2009-08-21 22:33:41

嗯,我只正向推了一下计算式,没做转换(实际上要我换也换不来……那个转换后的我压根就看不懂……-_-b)。 原式正不正确就不知道了。

ubuntuer2009-08-21 22:20:14

呵呵,你这个递归不就是 for(i=5; i<=num1; i+=5) { count += (num -i -1 )/2; } 我这个还是非递归的呢!!!^_^

chinaunix网友2009-08-21 21:59:12

楼主试试以下算法: 设给出的数字为x。则可行的方案总数为 n(x) = 1 + x\2 + n(x-5) 其中\ 指整除,比如4\5=0。以上算法需要用到迭代。n(x-5)在x<5的时候为0,n(0)=1。