博客园食用更加
题外话
也是在浏览题目,寻找能写的题解的时候看到了这道上老题,但是呢,这道题目的题解好像已经没有了,所以我也是来来发一篇随笔,一边供各位神犇们阅读,并寻找问题 虽然我对我的题解水平十分的(mei)有信心!!
以下题解!!
part 1 题面
任意一个正整数都可以拆成若干 2 的幂次相加。
规定:a^b 写成 a(b)
特殊约定:$2^1$直接简写为 2,不能写成 2(1)
2^0 固定写成 2(0)
每一个幂次里面的数字也要继续递归拆解,直到只剩下 0 和 2
样例:
137 = 2^7 + 2^3+2^0
逐层拆解最后得到:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
part 2 思路
就是分解成 2 的幂次
栤的教训:
-
2¹ 直接写 2
-
2⁰ 写 2(0)
part 3 代码思路
-
停止条件:数字 = 0 → 输出 0;
-
数字 = 1 → 不处理;
-
数字 = 2 → 输出 2
part 4 AC代码
#include <bits/stdc++.h>
using namespace std;
void calc (int n)
{
if (n == 0)
{
cout << 0;
return;
}
if (n == 1)
{
cout << 1;
return ;
}
if (n == 2)
{
cout << 2;
return ;
}
for (int i = 14; i >= 0; i--)
{
int tmp = 1 << i; // 1 << ?代表 2 * 2 * 2 …* 2(?个 2 相乘)
if (tmp <= n)
{
if (i == 1)
{
cout << 2;
}
else
{
cout << "2("; // 2 的 ?次方
calc (i); // 开始递归
cout << ")"; //前括号的结束
}
n -= tmp; // 留下的东西
if (n > 0)
{
cout << "+";
}
}
}
}
int main ()
{
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
calc (n);
cout << "\n";
return 0;
}