#include <iostream>
#include <vector>
unsigned long countBits(unsigned long number) {
unsigned long count{};
while (number > 0) {
if (number & 1 != 0) {
count++;
}
number >>= 1;
}
return count;
}
int main() {
unsigned long expectedSum{};
std::cin >> expectedSum;
unsigned long sum{};
std::vector<unsigned long> numbers;
unsigned long i{1};
while (sum < expectedSum) {
numbers.push_back(i);
sum += countBits(i);
i++;
}
long pos = numbers.size() - 2;
while (sum > expectedSum) {
unsigned long difference = sum - expectedSum;
const unsigned long numberOfBits = countBits(numbers[pos]);
if (numberOfBits <= difference) {
numbers.erase(numbers.begin() + pos);
sum -= numberOfBits;
}
pos--;
}
std::cout << numbers.size() << std::endl;
for (long i = numbers.size() - 1; i >= 0; i--) {
std::cout << numbers[i];
if (i > 0) {
std::cout << " ";
}
}
std::cout << std::endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <iostream> #include <vector> unsigned long countBits(unsigned long number) { unsigned long count{}; while (number > 0) { if (number & 1 != 0) { count++; } number >>= 1; } return count; } int main() { unsigned long expectedSum{}; std::cin >> expectedSum; unsigned long sum{}; std::vector<unsigned long> numbers; unsigned long i{1}; while (sum < expectedSum) { numbers.push_back(i); sum += countBits(i); i++; } long pos = numbers.size() - 2; while (sum > expectedSum) { unsigned long difference = sum - expectedSum; const unsigned long numberOfBits = countBits(numbers[pos]); if (numberOfBits <= difference) { numbers.erase(numbers.begin() + pos); sum -= numberOfBits; } pos--; } std::cout << numbers.size() << std::endl; for (long i = numbers.size() - 1; i >= 0; i--) { std::cout << numbers[i]; if (i > 0) { std::cout << " "; } } std::cout << std::endl; return 0; } |
English