Chinaunix首页 | 论坛 | 博客
  • 博客访问: 286006
  • 博文数量: 59
  • 博客积分: 1346
  • 博客等级: 中尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 17:17
文章分类

全部博文(59)

文章存档

2012年(9)

2011年(50)

分类: C/C++

2012-07-06 16:59:38

/*有N个士兵站成一队列, 现在需要选择几个士兵派去侦察。
为了选择合适的士兵, 多次进行如下操作: 如果队列超过三个士兵, 那么去除掉所有站立位置为奇数的士兵, 或者是去除掉所有站立位置为偶数的士兵。
直到不超过三个战士,
他们将被送去侦察。现要求统计按这样的方法,总共可能有多少种不同的正好三个士兵去侦察的士兵组合方案*/
#include
int function(int n,int m)

    int i,
    ret = 1;
    for(i=0;i    ret*=(n-i);
       return ret;
}
int cal(int n){
    if(n < 3)return 0;
    if(n == 3)return 1;
    if(n%2 == 0)
    {
        if(n/2>=3)
          return 2*function(n/2,3)/function(3,3);
        else
        return 2*cal(n/2);
    }
    else
    {  
        if(n/2>=3)
           return function(n/2+1,3)/function(3,3)+function(n/2,3)/function(3,3);
        else
           return cal(n/2) + cal(n/2+1);
    }
}
int main(){
    int N;
    while(scanf("%d", &N) > 0)
        printf("%d\n", cal(N));
    return 0;
}
//组合公式C(7,3)=7*6*5/3*2*1
/*int function(int n,int m)

    int i,
    ret = 1;
    for(i=0;i    ret*=(n-i);
       return ret;
}
void main(void)
{  int n,m; 
   int ret;  
   scanf("%d,%d",&m,&n);
   getchar();
   ret = function(m,n) / function(n,n); 
   printf("%d\n",ret);
   getchar();
}
//求n的阶层,采用自调用的方式
/*
int fix(int m)
{
    if(m==1)
       return 1;
    if(m>1)
     return m*fix(m-1); 
   
}
int main()
{
    int m;
    int i;
    do{
       scanf("%d",&m);
       getchar();
       if(m>0&&m<256)
         i=fix(m);
       else
         break;
       printf("i=%d",i);
       getchar();
    }while(1);
}
*/
阅读(2460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~