F题:整除序列
问题描述:
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,出这个序列中值为正数的项。
输入格式:
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,出这个序列中值为正数的项。
输出格式:
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
数据范围:数据范围: 1≤n≤10^18
输入样例:
20
输出样例:
20 10 5 2 1
思路:
一看到数据,超过10^6次,知道不能用简单的for循环解决了。应该是位运算。
要么开动态数组算,要么直接莽。
代码:
#include<iostream>
#include<stdio.h>
#include<vector>
#define pb push_back //懒人方法
using namespace std;
typedef long long ll;
vector<ll> v;//尽量把数组放外面 ,减少内存开销
int main(){
ll x;
scanf("%lld",&x);
v.pb(x);
while(x){
x>>=1;//左移一位的位运算
if(x){
v.pb(x);
}
}
for(int i=0;i<v.size();i++){
printf("%lld ",v[i]);//差点忘了怎么取出vector数组中的元素
}
return 0;
}
方法二:
#include<iostream>
using namespace std;
int main(){
long long x;
cin>>x;
while(x){
cout<<x<<" ";
x>>=1;
}
return 0;
}