poj3252Round Numbers(数学问题)

来源:互联网 发布:spss数据描述统计分析 编辑:程序博客网 时间:2024/06/08 03:20

大致题意:

输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number

所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制数中0的个数大于等于1的个数,则它就是一个Round Number

注意,转换所得的二进制数,最高位必然是1,最高位的前面不允许有0

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int c[33][33];//把组合数打表int bin[35];//10进制n的二进制数int a,b;void play_table(){for(int i=0;i<33;i++)c[i][0]=1;for(int i=1;i<33;i++)for(int j=1;j<=i;j++)c[i][j]=c[i-1][j-1]+c[i-1][j];}void dec_to_bin(int n){bin[0]=0;//记录二进制位数,当然n要大于0 while(n){bin[++bin[0]]=n&1;n>>=1;}}int round(int n){int sum=0;dec_to_bin(n);//计算比n的十进制位数少的 for(int i=1;i<bin[0]-1;i++)//第一位是1,故bin[0]-1for(int j=i/2+1;j<=i;j++)sum+=c[i][j];int zero=0;for(int i=bin[0]-1;i>0;i--)if(bin[i])//如果是1,则要么变成0,要么选择不变 for(int j=(bin[0]+1)/2-(zero+1);j<i;j++) sum+=c[i-1][j];else zero++;//如果是0,则只能选择不变 return sum; }int main(){play_table();while(~scanf("%d%d",&a,&b)) printf("%d\n",round(b+1)-round(a));return 0;}


1 0
原创粉丝点击