hyunjin

[C++][BOJ-11005/2745/1373]진법 변환, stoi , cout << oct, &연산 , -2 진법 본문

알고리즘 연습/백준

[C++][BOJ-11005/2745/1373]진법 변환, stoi , cout << oct, &연산 , -2 진법

_h.j 2021. 2. 16. 23:43
728x90

10진 -> n 진법


백준11005

 

소스코드

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,b;
	string ans;
	cin>> n>>b;	
	while(n>0){
		char c = (n%b)<10 ? char(n%b + '0') : char('A'-10 + n%b);
		ans = c + ans;
		n/=b;
	}
	cout<<ans;
	return 0;
}

n -> 10진 stoi(s,0,n)


백준 2745

 

소스코드

#include <bits/stdc++.h>
using namespace std;
int main(){
	string s;
	int n;
	cin >>s >>n;
	cout<<stoi(s,0,n);
	return 0;
}

stoi 활용

string s가 n진법으로 표현되었다 라는 것을 알려주고 int로 변환.


2진 -> 8진


백준 1373 

 

소스 코드

#include <bits/stdc++.h>
using namespace std;
int main(){
	string n,ans;
	cin>>n;
	int len = n.size();
	if( len %3 == 1)
		cout<<n[0]; 
	else if(len%3==2) cout <<( n[0] -'0')*2 + (n[1] -'0') ;
	for(int i = len%3 ; i < len ; i+=3 )
		cout << ( n[i]-'0') * 4 + (n[i+1]-'0')*2 + (n[i+2] -'0');
	return 0;
}

 

런타임 에러나지만 쉽게..

#include<bits/stdc++.h>
using namespace std;
int main(){
	string n;
	cin >> n;
	cout << oct << stoll(n,0,2);
	return 0;
}

cout 출력을 8진수로 하도록 바꿨다...

cout 출력 지정자 참고 

 


8진 -> 2진


백준 1212

 

소스코드1

#include <bits/stdc++.h>
using namespace std;
int main(){
	string n;
	cin >> n;
	for(int i = 0,tmp ; i < n.size();i++){
		string ans;
		tmp = n[i] - '0';
		if(tmp-4>=0){
			ans += '1';
			tmp -=4;
		}
		else ans += '0';
		
		if(tmp-2>=0){
			ans += '1';
			tmp -=2;
		}
		else ans += '0';
		
		if(tmp-1>=0){
			ans += '1';
			tmp -=1;
		}
		else ans += '0';
		
		(i==0) ? cout<<stoi(ans) : cout<<ans;
		
		//cout << ((i==0) ? stoi(ans) : ans );
	}
	return 0;
}

마지막에 cout 조심

 

 

소스코드2 - 숏코딩   &연산

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	bool flag=false;
	while( (n= getchar()) >='0' ){
		n = (n&4)*25 + (n&2)*5 + (n&1);
		//(flag) ? printf("%03d",n): printf("%d",n);  // 이것도 가능
		printf( (flag)? "%03d" : "%d", n );
		flag =true;
	}
	return 0;
}

& 연산자를 사용했다.

cout<< (4&4) << endl;  // 결과 : 4
cout<< (3&4) << endl;  // 결과 : 0
cout<< (8&4) << endl;  // 결과 : 0
cout<< (20&4) << endl;  // 결과 : 0

같은 자리에 1 있는 것만 0 아닌 결과 나옴.

 

이것을 이용해 문제를 푼다.

 


-2 진법


백준 -2진법 2089

 

소스 코드

 

 

 


n -> m 진법


백준 n -> m 진법 11576

 

소스 코드

#include <bits/stdc++.h>
using namespace std;
int main(){
	int a,b,m,tmp;
	string ans;
	long long dec=0;
	cin >> a >> b >>m;
	while(m--){
		cin>>tmp;
		dec = dec+(int)pow(a,m)*tmp ;
	}
	while(dec){
		ans = to_string(dec%b)+' ' +ans;
		dec/=b;
	}
	cout<<ans;
	return 0;
}

 

 

 

 

 

 

728x90