문제 링크입니다: http://www.codewars.com/kata/playing-with-digits
알고리즘 강의를 찾다가 알고리즘 문제가 모아져있는 www.codewars.com를 알게 되었습니다.
현재로써는 알고스팟에 집중하고 있지만 간간히 codewars도 방문해서 문제를 풀 생각입니다.
/*
재밌는 특성을 갖는 숫자들이 있다.
예를 들자면,
89 --> 8¹ + 9² = 89 * 1
695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2
46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
양의 정수 n(abcd...과 같은 형태 ex)1234)과 p가 주어졌을 때
(a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k
를 만족하는 경우 k를 반환하고 만족하지 않으면 -1을 반환하시오
*/
#include <iostream>
using namespace std;
//솔직히 이 클래스가 왜 있는지 모르겠다.
//아마 정답확인을 할 때 통일안이 필요해서인 것 같다.
class DigPow
{
public:
static int digPow(int n, int p);
};
int pow(int num, int p) //제곱수를 반환하는 함수
{
int multiply = num;
for (int i = 1; i<p; i++)
num *= multiply;
return num;
}
int DigPow::digPow(int n, int p)
{
int temp = n; //기존의 숫자 저장
int cnt = 0, sum = 0; //자릿수와 합
while (temp>0) //자릿수를 구하는 while문
{
temp /= 10;
cnt++;
}
int div = 1;
for (int i = 1; i < cnt; i++)
div *= 10; //자릿수만큼 10을 곱한다
temp = n; //다시 기존의 숫자 저장
for (int i = 0; i<cnt; i++)
{
int num = temp / div; //맨 앞자리수부터
sum += pow(num, p); //p제곱수만큼 합에 더한다
p++;
temp -= num*div; //더한 자릿수는 없애준다
div /= 10;
}
for (int k = 1; (n*k)<=sum; k++) //n*k가 합보다 작을 때까지 k를 증가시키고
if (sum == (n*k)) //만족하면
return k; //k 반환
return -1; //만족 안할시 -1 반환
}
int main(void)
{
cout << DigPow::digPow(89, 1) << endl;
cout << DigPow::digPow(92, 1) << endl;
cout << DigPow::digPow(46288, 3) << endl;
cout << DigPow::digPow(114, 3) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > codewars' 카테고리의 다른 글
codewars: Build a pile of Cubes (0) | 2018.01.29 |
---|---|
codewars: Fibonacci, Tribonacci and friends (0) | 2018.01.29 |
codewars: Consecutive strings (0) | 2018.01.29 |
codewars: A Rule of Divisibility by 13 (0) | 2018.01.29 |
codewars: Equal Sides Of An Array (0) | 2018.01.28 |