リンク:https://ac.nowcoder.com/acm/contest/1069/L
タイトル説明
任意の正の整数は、2の累乗として表すことができます。例えば:
= 2 137 7。 +2 3 +2 0
同時にAことを示すために角括弧で二回大会 Bが (b)のように表すことができます。
これは、見ることができる137は次のように表すことができる:
2(7)+ 2(3)+ 2(0)
さらに:7 = 2 2 + 2 + 2 0 (2 。1 2として示される)
3 2 + 2 = 0
だから最終的に137 :それは次のように表すことができる
2(2(2)+ 2 + 2(0))2 +(2 + 2(0))2 +(0)
別の例を:
1315 = 2 10 + 2 8 + 2 5 + 2 + 1
最後に、それはのように表すことができる1315。
2(2(2 + 2(0))+ 2)+ 2(2(2 + 2(0)))+ 2(2(2)+ 2(0))+ 2+ 2(0)
= 2 137 7。 +2 3 +2 0
同時にAことを示すために角括弧で二回大会 Bが (b)のように表すことができます。
これは、見ることができる137は次のように表すことができる:
2(7)+ 2(3)+ 2(0)
さらに:7 = 2 2 + 2 + 2 0 (2 。1 2として示される)
3 2 + 2 = 0
だから最終的に137 :それは次のように表すことができる
2(2(2)+ 2 + 2(0))2 +(2 + 2(0))2 +(0)
別の例を:
1315 = 2 10 + 2 8 + 2 5 + 2 + 1
最後に、それはのように表すことができる1315。
2(2(2 + 2(0))+ 2)+ 2(2(2 + 2(0)))+ 2(2(2)+ 2(0))+ 2+ 2(0)
説明を入力します。
正の整数(nは20000以下)
出力説明:
合意されたNに沿って0,2(表現にスペースなし)を表します
エントリー
1315
輸出
2(2(2 + 2(0))+ 2)+ 2(2(2 + 2(0)))+ 2(2(2)+ 2(0))+ 2 + 2(0)
アルゴリズムは、
タイトル自体の問題は、再帰的な特性を有しているので、この質問は、再帰的なアルゴリズムの目的です。この事実を知って、直接には、コードの再帰的チャンクを書き込み、デバッグを停止し、いくつかのif-elseループ伝達判断を追加しても、しばらくの間に生きることができるが、より明確にコードを書くために私が何を分析します。
分析
137 = 128 + 8 + 1 = 27 + 23 + 20 137 = 128 + 8 + 1 = 27 + 23 + 20
。7 = 4 + 2 + 1 = 22 + 2 + 207 = 4 + 2 + 1 = 22 + 2 +図20は、ある
3 = 2 + 2 + 1 = 13
我々は2つの機能の間のコードに反映少し手掛かり、この層は再帰的ではないが、それぞれ他の二つの間接再帰再帰構造を見ることができるからそして、間接再帰呼び出し。
これらの二つの構造である
^ 2 = 2のパワー非のパワー
2の非電源2の2 + 2 +···+電源のパワーのパワー=
ので、書き込みMIが2の出力パワーの二つの機能であり、CIは、二つの非電源の出力です。
フォーマットを取得するにはあまりにも難しい、フォーマットが変更されている、注意が知っている参照してください。。こんにゃく震え
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include < ストリング > 5の#include <math.h>の 6の#include <アルゴリズム> 7の#include <キュー> 8 CONST int型 INF = 0x3f3f3f3f 。 9 使用して 名前空間はstdを、 10 11 空隙マイル(INT&N)。 12 ボイド CI(int型i)を、 13の 14 空のCI(int型I) 15 { 16 であれば(I == 1 ) 17 { 18 // のprintf( ")")。 19 リターン; 20 } 21 そう なら(I == 0 ) 22 { 23 のprintf(" 0)" )。 24 リターン; 25 } 26 他の 27 { 28 int型の CNT = 0 。 29 一方、(I) 30 { 31 もし(!CNT = 0 ) 32 のprintf(" + " ); 33 マイル(I)。 34 // のprintf( ")")。 35 CNT ++ ; 36 } 37 } 38 のprintf(" )" )。 39 リターン; 40 } 41 42 空隙マイル(INT&N) 43 { 44 INT I。 45 のための(I = 0;; iは++ ) 46 { 47 であれば(POW(2、I)> N) 48 { 49 i-- 。 50 場合(I =!1 ) 51 のprintf(" 2(" ); 52 他の 53 のprintf(" 2 " ); 54の CI(I); 55 N- = POW(2 、I); 56 // のprintf(」 2 ^%dの」、I); 57 ブレーク; 58 } 59 そう であれば(POW(2、I)== N) 60 { 61 場合(I =!1 ) 62 のprintf(" 2(" ); 63 他の 64 のprintf(" 2 " ); 65の CI(I)。 66 // のprintf( "2("); 67 // CI(I); 68 N- = POW(2 、I); 69 // のprintf( "2 ^%のD"、I); 70 破ります; 71 } 72 } 73 リターン。 74 } 75 76 のint main()の 77 { 78 INT N。 79 のscanf(" %d個"、&N) 80 int型 CNT = 0 。 81 一方、(N) 82 { 83 であれば(CNT =!0 ) 84 のprintf(" + " )。 85 マイル(N) 86 // printfの( ")"); 87 CNT ++ ; 88 } 89 }