问题描述
有一个序列,序列第一个数是n,后面的每个数均是前一个数整除2的结果,请输出这个序列中值为正数的所有项。
输入格式
输入一行,包含一个整数n。
输出格式
输出一行,包含多个整数,相邻整数之间用一个空格分隔,表示答案。
样例输入
20
样例输出
20 10 5 2 1
评测用例规模与约定
对于80%的评测用例,1<=n<=10^9。
对于所有的评测用例,1<=n<=10^18。
解析
本题直接使用模拟法解决,每次对前一个数做除2运算即可。也可以用按位运算实现除2的效果。
右移运算符>>.把操作数的二进制码右移指定位数,左边空出来的用原来的符号位补齐。按位用的是补码不是原码。
参考程序
C
#include<stdio.h>
int main()
{
long long n;
scanf("%lld",&n);
while(n>0)
{
printf("%lld ",n);
n=n>>1;
}
return 0;
}
c++
#include<bits/stdc++.h>
int main()
{
long long n;
cin>>n;
while(n>0)
{
cout<<n<<" ";
n=n>>1;
}
return 0;
}