POJ-Round Numbers-组合数学

8 篇文章 0 订阅

题意;

    给你两个数n,m,让你看里面有多少个round数,(包括m,不包括n)

     round 数是对应的二进制数中0比1的个数多

思路:

    1.0 杨辉三角

    2.0 分阶层去算(不同的数位)1,10,100,1000,这样是4个阶层,先算出p(二进制的数的长度)的所有的,然后再算和p相同长度,但是比该数小的round数

CODE

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
int Cn[33][33];
int a[1100],b[1100];
void YH()///构建杨辉三角
{
    int i,j;
    for(i=0; i<=32; ++i)
    {
        Cn[i][0]=Cn[i][i]=1;
    }
    for(i=2; i<=32; ++i)
    {
        for(j=1; j<i; ++j)
        {
            Cn[i][j]=Cn[i-1][j-1]+Cn[i-1][j];
        }
    }
}
int round(int p)
{
    int i, j;
    int ans = 0;
    for(i = 2; i < p; i++)///p位数之前的那些
    {
        for(j =(i+1)/2; j < i; j++)
        {
            ans+=Cn[i-1][j];
        }
    }
    int k=0;///统计0的个数
    int ki = (p+1)/2;///至少要这些个0
    for(i = p-2; i >= 0; i--)///和p位数在同一个阶层
    {
        if(a[i] == 1)
        {
            int mi = ki-k-1;///后面至少需要这些0,才是round数
            for(; mi <= i; mi++)
                ans+=Cn[i][mi];
        }
        else
            k++;
    }
    return ans;
}
int main()
{
    YH();
    int n, m;
    while(~scanf("%d%d",&n,&m))
    {
        scanf("%d%d",&n,&m);
        int p = 0, q = 0;
        m++;///要m那个数,不要n
        while(n)///转化为二进制
        {
            a[p++] = n%2;
            n = n/2;
        }

        int ans = 0, num = 0;
        ans = round(p);///n之前的round数
        while(m)
        {
            a[q++] = m%2;
            m = m/2;
        }
        num = round(q);///包括m在内的round数
        printf("%d\n",num-ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值