acwing 3483
Posted wdxt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了acwing 3483相关的知识,希望对你有一定的参考价值。
acwing 3483.2的幂次方
每个正数都可以用指数形式表示。
例如,137=27+23+20。
让我们用 a(b) 来表示 ab。
那么 137 可以表示为 2(7)+2(3)+2(0)。
因为 7=22+2+20,3=2+20,所以 137 最终可以表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。
给定一个正数 n,请你将 n 表示为只包含 0 和 2 的指数形式。
输入格式
输入包含多组数据。
每组数据占一行,一个正数 n。
输出格式
每组数据输出一行,一个指数形式表示。
数据范围
1≤n≤20000,
每个输入最多包含 100 组数据。
输入样例:
1315
输出样例:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
思路:
1315=2(7)+2(3)+2(0)
,求出1315
的2的次方组合后我们还有求其中2的指数的组合,然后依次加入到括号当中所以用递归就直接可以求出来了。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
string dfs(int x)
{
string res;
for(int i = 14; i >= 0; i --) // 因为最大值是20000,所以最多也就2的14次方
{
if(x >> i & 1)// 判断x的最高位,然后i就是其中2的指数
{
if(res.size()) res += \'+\';//在不为1的时候要用+号连接
if(!i) res += "2(0)";//如果为0的话就加上2(0)
else if(i == 1) res += "2";// 如果为1就加上2
else res += "2(" + dfs(i) + ")";// 如果不为0或者1那么就代表我
//们可以以将指数再分解,用2(dfs(i))这样的形式括起来,将i分解后的字符串加到答案中。
}
}
return res;
}
int main()
{
int n;
while(cin >> n)
{
cout << dfs(n) << endl;
}
return 0;
}
以上是关于acwing 3483的主要内容,如果未能解决你的问题,请参考以下文章
一些特殊的矩阵快速幂 hdu5950 hdu3369 hdu 3483