P1010 [NOIP 1998 普及组] 幂次方 题解
题外话
也是在浏览题目,寻找能写的题解的时候看到了这道上古老题,但是呢,这道题目的题解好像已经没有了,所以我也是来博客园上来发一篇随笔,一边供各位神犇们阅读,并寻找问题 虽然我对我的题解水平十分的(mei)有信心!!
以下题解!!
part 1 题面
任意一个正整数都可以拆成若干 2 的幂次相加。
规定:a^bab 写成 a(b)
特殊约定:2^121直接简写为 2,不能写成 2(1)2(1)
2^020 固定写成 2(0)2(0)
每一个幂次里面的数字也要继续递归拆解,直到只剩下 00 和 22
样例:
137 = 2^7 + 2^3+2^0137=27+23+20
逐层拆解最后得到:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
part 2 思路
就是分解成 2 的幂次
栤的教训:
-
2¹ 直接写 2
-
2⁰ 写 2(0)
part 3 代码思路
-
停止条件:数字 = 00 -> 输出 00;
-
数字 = 11 -> 不处理;
-
数字 = 22 -> 输出 22
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;
}
本文来自博客园,作者:#栤,转载请注明原文链接:https://www.cnblogs.com/wth1123/p/20021987

浙公网安备 33010602011771号