블 루 브리지 컵 준비 경기: 알고리즘 훈련 2 의 차 멱 표시 (재 귀)
7872 단어 알고리즘
개인 분석: 이 문 제 는 힌트 도 분명하게 말 했 습 니 다. 시험 점 은 재 귀 에 있 습 니 다!문 제 를 읽 으 면서 우 리 는 재 귀적 인 사상 을 대충 느 낄 수 있다. 이것 은 분명 하 다!자, 분석 시작:
int r=0;
while(pow(2,r)<=n)
{
r++;
}
r--;
여기 서 왜 뒤에 r - - (r 대표 지수) 를 해 야 합 니까? 예 를 들 어 우리 n 은 32 와 같 습 니 다. 분명히 2 ^ 5 = 32 는 r = 5 시 에 while 순환 의 조건 을 만족 시 킬 때 r + r 는 6 이지 만 2 ^ 6 = 64 이기 때문에 뒤에 r - 뒤 에는 재 귀 입 니 다. 핵심 적 인 부분 은 제 가 설명 하 겠 습 니 다.
int other=n-pow(2,r);
if(other)
{
cout<<"+";
f(other);
}
예 를 들 어 샘플 137 은 2 (7) + 2 (3) + 2 (0) 로 표시 할 수 있다. 처음에 우리 가 얻 은 것 은 r = = 7 이 고 재 귀 를 하면 2 (2 (2) + 2 (0) 를 얻 을 수 있다. 이것 은 앞의 부분 일 뿐 이 고 분명 한 부분 은 우리 가 other 에 게 할당 한 다음 에 계속 재 귀 를 해서 뒤의 두 부분 + 2 (2 + 2 (0) + 2 (0) 를 얻 을 수 있 기 때문에 마지막 사례 수출: 2 (2 (2) + 2 (0) + 2 (2 + 2) + 2 (0) + 2 (0) + 2 (0) + 2 (0)
구체 적 인 코드 는 다음 과 같다: AC
#include
#include
using namespace std;
void f(int n)
{
int r=0;
while(pow(2,r)<=n)
{
r++;
}
r--;
if(r==0)
{
cout<<"2(0)";
}
else if(r==1)
{
cout<<"2";
}
else
{
cout<<"2(";
f(r);
cout<<")";
}
int other=n-pow(2,r);
if(other)
{
cout<<"+";
f(other);
}
}
int main()
{
int n;
while(cin>>n)
{
f(n);
cout<<endl;
}
return 0;
}
,
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.