对于一个由0…n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
输入例子:
500
输出例子:
255
#include <stdio.h>
#include <math.h>
#include <bits/stdc++.h>
/*
初始第一个数是:0
第1次进行奇数位删除后,第一个数变成:1
第2次进行奇数位删除后,第一个数变成:3
第3次进行奇数位删除后,第一个数变成:7
第4次进行奇数位删除后,第一个数变成:15
第5次进行奇数位删除后,第一个数变成:31
第6次进行奇数位删除后,第一个数变成:63
第7次进行奇数位删除后,第一个数变成:127
第8次进行奇数位删除后,第一个数变成:255
可以发现规律:2的n次方-1
在第c次进行奇数位删除后只剩下1个数,最后那个数就是所求的数
*/
int main()
{
int n,c=0;
scanf("%d",&n);
int k=n+1; //k是0-n 的这n+1个数
while(k!=1)//每进行一次删奇数位丢弃,剩下一半的个数
{
k=k/2;
c++; //c记录循环找到需要进行几次奇数位丢弃
}
int a=pow(2,c)-1;//a是2的c次方-1
printf("%d\n",c);
printf("%d\n",a);
return 0;
}