P1010
很久以前写的一道题,一道简单的模拟题或者是数学题?
一看题面,很明显能想到用二进制的思想
比如:13用二进制表示就是1101,也即13= 2^0 + 2^2 + 2^3
所以此题就是相当于在找二进制数中1的位置下标
怎么找?用移位运算
右移位: 二进制数往右移一位,相当于此数除以2,对应的还有左移位
如 13>>1 后等于6 ,二进制表示就是由1101变为110
话不多说,干代码:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <stack>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <fstream>
#define LL long long
#define ULL unsigned long long
#define INF 1000000001
using namespace std;
const int maxn = 1002;
int n;
string ans;
int init(int arr[], int n) {
int i = 0, j = 0;
while (n) {
if (n & 1) arr[j++] = i; //末位为1时就把i加到数组中去
n >>= 1; //移位,相当于n/2
i++;
}
return j;
}
void solve(int n) {
if (n == 3) {
ans += "2+2(0)";
return;
}
else if (n == 2) {
ans += "2";
return;
}
else if (n == 0) {
ans += "0";
return;
}
else {
int vec[maxn];
int vs = init(vec, n), j = 1;
for (int i = vs - 1; i >= 0; i--) {
if (vec[i] == 1)
ans += "2";
else {
ans += "2(";
solve(vec[i]);
ans += ")";
}
if (j != vs) {
ans += '+';
j++;
}
}
}
}
int main() {
scanf("%d", &n);
solve(n);
cout << ans;
return 0;
}