情報オリンピックの1冊の通1208:2のべき乗の次の方は表します
1193 ワード
1208:2のべき乗次数は【題目説明】いずれの正の整数も2のべき乗次数で表すことができる.例:
137=27+23+20
同時に、abはa(b)と表すことができる.このことから、137は、
2(7)+2(3)+2(0)
さらに:7=22+2+20(21は2で表す)
3=2+20
最後の137は、
2(2(2)+2+2(0))+2(2+2(0))+2(0)
次のようになります.
1315=210+28+25+2+1
したがって、1315は、以下のように表すことができる.
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
【入力】正の整数n(n≦20000).
【出力】1行、所定のnの0,2に該当する(表示にスペースは使用できません).
【入力サンプル】137【出力サンプル】2(2)+2+2(0))+2(2+2(0))+2(0))+2(0)方法1(方法2の改良版、1つの再帰関数で):
方法2(2つの再帰関数を使って、利点は面倒です):
137=27+23+20
同時に、abはa(b)と表すことができる.このことから、137は、
2(7)+2(3)+2(0)
さらに:7=22+2+20(21は2で表す)
3=2+20
最後の137は、
2(2(2)+2+2(0))+2(2+2(0))+2(0)
次のようになります.
1315=210+28+25+2+1
したがって、1315は、以下のように表すことができる.
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
【入力】正の整数n(n≦20000).
【出力】1行、所定のnの0,2に該当する(表示にスペースは使用できません).
【入力サンプル】137【出力サンプル】2(2)+2+2(0))+2(2+2(0))+2(0))+2(0)方法1(方法2の改良版、1つの再帰関数で):
//1208:2
#include
int i,a[15],num;
using namespace std;
void dfs(int n)
{
int k;
for(k=14;k>=0;k--)
{
if(a[k]<=n)// ,
break;
}
// 2 k
if(k==0) // 2 0
{
cout<=3 ,
{
// "2(k)", k dfs(k)
cout<>num;
dfs(num);
return 0;
}
方法2(2つの再帰関数を使って、利点は面倒です):
//1208:2
#include
int i,a[15],num;
using namespace std;
void dfs(int n);
void pr(int k) // 2 k
{
if(k==0) cout<=0;k--)
{
if(a[k]<=n)// ,
break;
}
// 2 k
if(k!=1)// k 1 ,2 k "2(k)" ,
{
cout<>num;
dfs(num);
return 0;
}