Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826984
  • 博文数量: 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;
}

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

chinaunix网友2009-08-21 19:19:31

穷举也是一种算法,不要歧视穷举,能算出来就行了。

ubuntuer2009-08-21 12:43:32

我们是谈算法,不是论蛮力!!穷举!

chinaunix网友2009-08-21 11:08:11

int num = 1; int result = 0; StringBuffer sbuf = new StringBuffer(10240); for (int x = 1; x <= 1000 - 7; x++) { for (int y = 1; y <= (1000 - 6) / 2; y++) { for (int z = 1; z <= (1000 - 3) / 5; z++) { result = x + y * 2 + 5 * z; if (result == 1000) { String s = (num) + ": x=" + x + ";y=" + y + ";z=" + z+";result="+result; sbuf.append(s).append("\r"); num++; } } } }