2의 차멱 표시(귀속 구해)

문제 설명은 모든 정수를 2진수로 표시할 수 있습니다. 예를 들어 137의 2진수는 10001001입니다.이런 2진법 표시를 2로 쓴 차멱의 합 형식으로 차멱이 높은 것을 앞에 놓으면 다음과 같은 표현식을 얻을 수 있다. 137=27+23+2^0 현재 약정된 차멱은 괄호로 표시한다. 즉, a^b는 a(b)로 표시된다. 이때137은 다음과 같이 표시할 수 있다. 2(7)+2(3)+2(0) 진일보: 7=22+20(2^1은 2로 표시) 3=2+2^0 그래서 마지막 137은 다음과 같다. 2(2(2)+2(0)+2(2+2(0)+2(0))+2(0)+2(0)+2(0)+2(0)+2(0)(1<=n<=2000) 출력 형식이 약정된 n에 부합되는 0, 2는 (표시에 빈칸이 있을 수 없음) 샘플 입력 137샘플 출력 2(2(2)+2(0)+2(2)+2(0)+2(0) 샘플 입력 1315샘플 출력 2(2(2(2+2(0)+2(2(2)+2(0) 팁: 비귀속 프로그램으로 해결하기 어려워 변속 출력을 사용할 수 있음
이곳의 힌트도 이미 뚜렷하다. 귀속을 하면서 출력을 한다고 하면 귀속을 배우는 나쁜 사람에게는 블로그를 써서 반성하고 보충해야 한다.여기서 우리는 먼저 그것을 2진법으로 바꾼다. 이것은 의심할 여지가 없다. 2진법으로 바뀔 때 1이 2진법에서 나타난 위치를 통계하면서 하나의 수조로 그것을 a[]와 같이 저장하지만 어떻게 귀속을 실현할 것인가. 여기는 137=2^7+2^3+2^0이다. 이때 하나의 수조는 7, 3, 0을 기록했지만 대응하는 7, 3이 조건을 만족시키지 못하면 어떻게 하면 귀속을 사용할 수 있다.7 = 2^2 + 2^1 + 2^0, 이때 조건을 만족시킨다. 대응하는 2, 1, 0을 기록하고 같은 이치 3 = 2^1 + 2^0도 조건을 만족시킨다. 대응하는 1, 0을 기록한다.여기서 또 하나의 중요한 점은 중지 조건이다. 우리가 생각해 보면 그는 표현 형식을 바꿨을 뿐이다. 우리가 기록한 것은 그것의 지수이기 때문이다.
       1.만약 a[i]==1이라면 출력은 22입니다.만약 a[i]==2이면 출력은 2(2)3.만약에 a[i]==0, 출력이 2(0)라면 여기까지 말씀드리고 싶은데 코드는 다음과 같습니다.
#include
using namespace std;
void fun(int x);
int main()
{
	int n;
	cin>>n;
	fun(n);
	return 0; 
}

// x b  
void fun(int x)
{
	int a[32], i = 0, cnt = 0;
	// a , 
	// , a , a  
	while(x != 0)
	{
		int m = x%2;
		if(m == 1)
		{
			a[cnt] = i; cnt++;	
		}
		x /= 2; i++;
	}
	for(i = cnt-1; i >= 0; i--)
	{
		if(a[i] == 0)
			printf("2(0)");
		else if(a[i] == 1)
			printf("2");
		else if(a[i] == 2)
			printf("2(2)");
		else
		{
			printf("2("); fun(a[i]); printf(")");
		}
		if(i != 0)
			printf("+");	
	}	
}


강조, 이곳의 수조 a[]는 반드시 국부 변수로 재정의되어야 한다. 그렇지 않으면 원래의 값을 수정할 것이다. 여기에서 오랫동안 끊겼는데 왜 틀렸을까...

좋은 웹페이지 즐겨찾기