이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

카프리카 수

카프리카 수

카프리카 수란 인도의 수학자 D.R.카프리카의 의해 정의한 수이다.

어떤 수의 제곱수를 두 부분으로 나누어 더하였을 때 다시 원래의 수가 되는 수들을 의미한다.

예를 들어 45는 카프리카 수인데, 45² = 2025이고, 20+25 = 45이기 때문이다.

  1. 어떤 수를 입력 받고 그 수가 카프리카 수인지 아닌지를 출력하는 함수를 만드시오.

  2. 어떤 수를 입력 받고 자릿수가 그 수인 모든 카프리카 수를 출력하시오.

  3. 어떤 수를 입력 받고 어떤 수 이하의 모든 카프리카 수를 출력하시오.

이 셋중에서 원하는 유형 하나를 골라 푸시오.

입력 (유형 1)

print(kaprekar_number(1))
print(kaprekar_number(45))
print(kaprekar_number(297))
print(kaprekar_number(3213))

출력 (유형 1)

True
True
True
False

카프리카 상수

카프리카 상수도 마찬가지로 인도의 수학자 카프리카가 발견한 상수이다.

이 상수의 생성법은 다음과 같다.

  1. 숫자 하나로만 이루어지지 않은 4자리 수를 정한다. (예: 1000은 인정하되, 1111은 인정하지 않는다.)
  2. 첫 자리에 0이 와도 무방하다.
  3. 이 숫자를 크기 순으로 배열하여 두 수를 만든다. 하나는 큰 순, 하나는 작은 순으로 배열한다.
  4. 큰 쪽에서 작은 쪽을 빼 준다. 이때 나온 0은 유지한다.
  5. 이 과정을 반복하면 7번 이내로 6174가 나온다.

어떤 수를 입력 받고 몇번이내로 6174가 완성 되었는지 출력하는 함수를 입력하시오

단, 입력값은 정수여야 한다.

입력

print(kaprekar_constant(4371))
print(kaprekar_constant(21))
print(kaprekar_constant(1))
print(kaprekar_constant(1111))

출력

7
3
5
False

--------출처 및 참고 자료--------

카프리카 수 (위키백과) :

https://ko.wikipedia.org/wiki/%EC%B9%B4%ED%94%84%EB%A6%AC%EC%B9%B4_%EC%88%98

카프리카 수 유형 2:

https://jjycjnmath.tistory.com/413

카프리카 상수 (위키백과) :

https://ko.wikipedia.org/wiki/%EC%B9%B4%ED%94%84%EB%A6%AC%EC%B9%B4_%EC%83%81%EC%88%98

2019/02/07 12:11

김영성

"카프리카 수"에서 1이 왜 포함되는지 한참 들여다봤습니다. 한글 위키백과에도 정확하게 안 쓰여 있네요. https://en.wikipedia.org/wiki/Kaprekar_number 나누어진 앞의 수는 0 이상의 정수, 뒤의 수는 0보다 큰 정수여야 합니다. - Noname, 2019/07/01 16:11
카프리카 상수에 1을 넣었을 때 결과입니다. 0001 => (1000, 1) => 999 0999 => (9990, 999) => 8991 8991 => (9981, 1899) => 8082 8082 => (8820, 288) => 8532 8532 => (8532, 2358) => 6174 5 위키백과 영문에서: "The only four-digit numbers for which Kaprekar's routine does not reach 6174 are repdigits such as 1111, which give the result 0000 after a single iteration. All other four-digit numbers eventually reach 6174 if leading zeros are used to keep the number of digits at 4." 마지막 if절을 보면 '1111', '2222', ..., '9999' 만 제외되고, 다른 경우는 '1'을 '0001'로, '999'를 '0999'로 보고 인정하는 게 맞아 보입니다. - Noname, 2019/07/01 16:06
수정하였습니다. - 김영성, 2021/03/08 10:25

32개의 풀이가 있습니다.

def kaprekar_number(num):
    n = str(num**2).zfill(2)
    n = list(int(n[:i])+int(n[i:]) for i in range(1,len(n)//2+1) if 0 != int(n[i:]))
    return num in n

def kaprekar_numbers(num):
    return list(x for x in range(1,num+1) if kaprekar_number(x))

def kaprekar_digit(num):
    return list(x for x in range(10**(num-1),10**num) if kaprekar_number(x))


def kaprekar_constant(num, i = 0):
    if len(set(str(num).zfill(4))) != 1 and len(str(num)) < 5:
        while num != 6174:
            num,i = str(num).zfill(4),i+1
            num = int(''.join(sorted(num)[::-1]))-int(''.join(sorted(num)))
        return i
    return False

2019/02/07 12:13

김영성

# Prob 1.
def kaprekar_number(num):
    num_sq = num ** 2
    if num_sq == num:
        return True
    num_sq_str = str(num_sq)
    for i in range(len(num_sq_str)-1):
        first = int(num_sq_str[:i+1])
        second = int(num_sq_str[i+1:])
        if (first + second) == num:
            if second == 0:
                return False
            return True
    return False

print(kaprekar_number(1))
print(kaprekar_number(45))
print(kaprekar_number(297))
print(kaprekar_number(3213))

# Prob 2.
def kaprekar_number_digit(digit):
    num_list = range(10 ** (digit-1), 10 ** (digit))
    return list(i for i in num_list if kaprekar_number(i))

print(kaprekar_number_digit(1))
print(kaprekar_number_digit(2))
print(kaprekar_number_digit(3))
print(kaprekar_number_digit(4))

# Prob 3
def kaprekar_number_under(num):
    return list(i for i in range(num+1) if kaprekar_number(i))

print(kaprekar_number_under(100))
print(kaprekar_number_under(1000))
print(kaprekar_number_under(9999))
print(kaprekar_number_under(22222))

풀이입니다~

2019/02/07 19:32

김기민

# 카프리카 수 인지 확인하는 함수
def kaprekar_number(number):
    square = number ** 2
    str_square = str(square)
    if square > 9:
        for x in range(1, len(str_square) - 1):
            if int(str_square[:x]) + int(str_square[x:]) == number:
                return 'True'
        return 'False'
    else:
        if square == number:
            return 'True'
        return 'False'

# 입력받은 수를 작은순서대로 정렬해주는 함수
def make_sorted_number(number):
    temp = ''
    for x in sorted(str(number)):
        temp += x
    while len(temp) < 4:
        temp += '0'
    return int(temp)

# 입력받은 수를 큰 순서로 정렬해주는 함수
def make_reversed_number(number):
    temp = ''
    for x in reversed(sorted(str(number))):
        temp += x
    while len(temp) < 4:
        temp = '0' + temp
    return int(temp)

# 카프리카 상수 확인하는 함수
def kaprekar_constant(number):
    count = 0
    while make_reversed_number(number) - make_sorted_number(number) != 6174:
        if number > 1000 and number % 1111 == 0:
            return "False"
        elif 1000 > number > 100 and number % 111 == 0:
            return "False"
        elif 10 < number < 100 and number % 11 == 0:
            return "False"
        else:
            number = abs(make_reversed_number(number) - make_sorted_number(number))
            count += 1
    return count + 1

2019/02/07 20:59

농창

def Kafrica(number):
    if number == int(str(number**2)[:len(str(number**2))//2])+int(str(number**2)[len(str(number**2))//2:]): return True
    else: return False


print(Kafrica(45))



def Kafrica_2(number):
    count=1
    while count <v8:
        number = int(''.join(sorted(list(str(number).zfill(4)), reverse=True)))-int(''.join(sorted(list(str(number).zfill(4)))))
        if number == 6174: return count
        count+=1        
    return False

print(Kafrica_2(297))

2019/02/07 21:27

얀차

함수형식으로 구현했습니다~ - 얀차, 2019/02/07 21:28

Ruby

# 1. Checking if it's a kaprekar
kaprekar = ->n, sq=(n**2).to_s do 
  is_k = ->nums { n == nums.sum(&:to_i) && nums.all? {|s| s == "" or s.match?(/[^0]/)} }
  sq.size.times.any? {|i| is_k.([sq[0..i], sq[i+1..]]) }
end

# 2. Generates n-digit kaprekars
kaprekar_dgt = ->ndgt { (10**(ndgt-1)..10**(ndgt)-1).select &kaprekar }

# 3. All kaprekars less than limit
kaprekar_below = ->limit { (1..limit).select &kaprekar }

# 4. kapreka constant
kaprekar_const = ->n, cnt=0, num=n.to_s do
  (return false) if num.squeeze.size == 1
  sorted = num.rjust(4, '0').chars.sort
  n == 6174 ? cnt : kaprekar_const[(sorted.join.to_i - sorted.reverse.join.to_i).abs, cnt + 1]
end

Test

# 1. Check kaprekar
expect([1, 45, 99, 297].map(&kaprekar) ).to all be_truthy
expect([2, 100].map(&kaprekar) ).to all be_falsy

# 2. Generates n-digit kaprekars
expect(kaprekar_dgt[3]).to eq [297, 703, 999]

# 3. All kaprekars less than n
expect(kaprekar_below[1000]).to eq [1, 9, 45, 55, 99, 297, 703, 999]

# 4. Kaprekar constant
expect([4371, 21, 1, 1111].map(&kaprekar_const)).to eq [7, 3, false, false]

2019/02/07 23:09

rk

perl v5.20.2 for MSWin32-x64-multi-thread 실행확인.

수정1. 100과 같은 "0"이 들어가는 경우 예외처리

100은 카프리카 수가 아니다. 100² = 10000이고 100 + 00 = 100이지만, 00은 양수가 아니기 때문이다. (https://ko.wikipedia.org/wiki/%EC%B9%B4%ED%94%84%EB%A6%AC%EC%B9%B4_%EC%88%98)

수정2. &kaprekar_number1 수정. 코드 간소화 측면...

use strict;#착한 펄린이는 두개를 모두 씁니다.
use warnings;#착한 펄린이는 두개를 모두 씁니다.

sub kaprekar_number1
{#어떤 수를 입력 받고 그 수가 카프리카 수인지 아닌지를 출력하는 함수
    my $input=shift;
  my $result = &kaprekar_number($input);
  if($result)
    {
        return "True\n";
    }
    return "False\n";
}


sub kaprekar_number2
{#어떤 수를 입력 받고 자릿수가 그 수인 모든 카프리카 수를 출력하는 함수
    my $input=shift;
    if($input<1)
  {
   return "None\n"; #0자릿수 수는 없음.
  }
    my $limit=(10**$input);
    my $i=(10**($input-1));
    my $temp_result;
    my @result;
    while($i<$limit)
    {
        $temp_result=&kaprekar_number($i);
        if($temp_result)
        {
            push(@result,$temp_result);
        }
        $i++;
    }
    return "@result\n";
}

sub kaprekar_number3
{#어떤 수를 입력 받고 어떤 수 이하의 모든 카프리카 수를 출력하는 함수
    my $input=shift;
    if($input<0)
  {
   return "None\n"; #입력값이 0보다 작으면 무효.
  }
    my $i=$input;
    my $temp_result;
    my @result;
    while($i>0)
    {
        $temp_result=&kaprekar_number($i);
        if($temp_result)
        {
            push(@result,$temp_result);
        }
        $i--;
    }
    return "@result\n";
}

sub kaprekar_number
{#어떤 수를 입력 받고 그 수가 카프리카 수이면 그 수를 반환하는 함수 kaprekar_number1,3에서 사용.
    my $input=shift;
    if($input==1)
  {
  return 1;#제곱했을때 10미만인 카프리카수는 1뿐. 예외처리
  }
    my $inputs=$input*$input;
    $inputs="$inputs";
    my $a; my $b;
    for my $i (1..(length($inputs)-1))
    {
        $a=substr($inputs,0,$i);
        $b=substr($inputs,$i,(length($inputs)-$i));
        if(((int($a)+int($b))==$input)&&(int($a)!=0&&int($b)!=0))
        {
            return $input;
        }
    }
    return 0;
}

sub kaprekar_constant
{#어떤 수를 입력 받고 몇번이내로 6174가 완성 되었는지 출력하는 함수
    my $input=shift;
    if(($input>9999)||($input==0)||(($input%1111)==0))
    {
        return "False";
    }
    my $count=0;
    my $inputs="$input";
    if(length($inputs)<4)
    {
        for(my $i=0;$i<=4-length($inputs);$i++)
        {
            $inputs="0".$inputs;
        }
    }
    my @array=(substr($inputs,0,1),substr($inputs,1,1),substr($inputs,2,1),substr($inputs,3,1));
    my @arrayA=&sortingA(\@array);
    my $numA=$arrayA[0].$arrayA[1].$arrayA[2].$arrayA[3];
    my @arrayD=&sortingD(\@array);
    my $numD=$arrayD[0].$arrayD[1].$arrayD[2].$arrayD[3];
    my $result;
    for($count=1;$count<8;$count++)
    {
        $result=int($numD)-int($numA);
        if($result==6174)
        {
            return $count;
            last;
        }
        $result="$result";
        if(length($result)<4)
        {
            for(my $i=0;$i<=4-length($result);$i++)
            {
                $result="0".$result;
            }
        }
        @array=(substr($result,0,1),substr($result,1,1),substr($result,2,1),substr($result,3,1));
        @arrayA=&sortingA(\@array);
        $numA=$arrayA[0].$arrayA[1].$arrayA[2].$arrayA[3];
        @arrayD=&sortingD(\@array);
        $numD=$arrayD[0].$arrayD[1].$arrayD[2].$arrayD[3];
    }
    return "False\n";
}

sub sortingA
{#오름차순 정렬 함수
    my @input=@{+shift};
    foreach my $i (0..$#input-1) 
    {
        foreach my $j (1..$#input-$i) 
        {
            if($input[$j-1]>=$input[$j])
            {
                ($input[$j-1],$input[$j]) = ($input[$j],$input[$j-1]);
            }
        }
    }
    return @input;
}

sub sortingD
{#내림차순 정렬 함수
    my @input=@{+shift};
    my $size=$#input;
    foreach my $i (0..$size-1) 
    {
        foreach my $j (1..$size-$i) 
        {
            if($input[$j-1]<=$input[$j])
            {
                ($input[$j-1],$input[$j]) = ($input[$j],$input[$j-1]);
            }
        }
    }
    return @input;
}

print(&kaprekar_number1(22222));
print(&kaprekar_number2(1));
print(&kaprekar_number3(9));
print(&kaprekar_constant(14));

숫자와 문자열을 오가면서 처리하는 방식.

정렬 구현참고 https://zetawiki.com/wiki/Perl_%EA%B1%B0%ED%92%88%EC%A0%95%EB%A0%AC_%EA%B5%AC%ED%98%84

2019/02/09 03:30

Uranus

C#

using System;
using System.Collections.Generic;
using System.Numerics;
using System.Linq;

namespace CD214
{
    class Program
    {
        static void Main()
        {
            var result = new Kaprekar();

            // 유형 1
            Console.WriteLine(result.IsKaprekarNumber(1));
            Console.WriteLine(result.IsKaprekarNumber(45));
            Console.WriteLine(result.IsKaprekarNumber(297));
            Console.WriteLine(result.IsKaprekarNumber(3213));

            // 유형 2
            Console.WriteLine(string.Join(", ", result.GetNdigitKaprekarNumbers(5)));

            // 유형 3
            Console.WriteLine(string.Join(", ", result.GetKaprekarNumbersBelow(10000)));

            // 카프리카 상수
            Console.WriteLine(result.CountKaprekarRoutines(4371));
            Console.WriteLine(result.CountKaprekarRoutines(21));
            Console.WriteLine(result.CountKaprekarRoutines(1));
            Console.WriteLine(result.CountKaprekarRoutines(1111));

            Console.ReadKey();
        }
    }

    class Kaprekar
    {
        // (유형1) 카프리카 수인지 판단
        public bool IsKaprekarNumber(BigInteger aNum)
        {
            string str = (aNum * aNum).ToString();
            if (str.Length % 2 == 1) { str = "0" + str; }

            int divideIdx = str.Length / 2;
            BigInteger former = BigInteger.Parse(str.Substring(0, divideIdx));
            BigInteger latter = BigInteger.Parse(str.Substring(divideIdx, divideIdx));
            if (latter == 0) { return false; }

            return aNum == former + latter ? true : false;
        }

        // (유형2) ndigit 자리수의 카프리카 수 반환
        public List<BigInteger> GetNdigitKaprekarNumbers(int ndigit)
        {
            var result = new List<BigInteger>();
            for (var i = (BigInteger)Math.Pow(10, ndigit - 1); i < (BigInteger)Math.Pow(10, ndigit); i++)
            {
                if (IsKaprekarNumber(i)) { result.Add(i); }
            }
            return result;
        }

        // (유형 3) 특정 수 이하의 카프리카 수 반환
        public List<BigInteger> GetKaprekarNumbersBelow(BigInteger aNum)
        {
            var result = new List<BigInteger>();
            for (var i = 1; i <= aNum; i++)
            {
                if (IsKaprekarNumber(i)) { result.Add(i); }
            }
            return result;
        }

        // 카프리카 상수
        public string CountKaprekarRoutines(int aNum)
        {
            if (aNum <= 0 || aNum > 9999) { return false.ToString(); }

            int count = 0;
            int KaprekarConstant = 6174;
            do
            {
                string str = aNum.ToString().PadLeft(4, '0');
                if (str.Distinct().Count() == 1) { return false.ToString(); }
                var sorted = str.OrderByDescending(c => char.GetNumericValue(c)).ToArray();
                int bigger = int.Parse(new string(sorted));
                Array.Reverse(sorted);
                int smaller = int.Parse(new string(sorted));
                aNum = bigger - smaller;
                count++;
            } while (aNum != KaprekarConstant);

            return count.ToString();
        }
    }
}

2019/02/13 12:32

mohenjo

문제풀이

규칙이 비교적 간단하고 답이 정해져 있어서 알고리즘을 짜는데 어려움은 없었습니다. 그러나 예외상황에 대해 if문을 자주 적용하여 이부분을 최소화하는 방법을 알 수 있었으면 좋겠습니다.

1. 카프리카수

def kaprekar_number(num):
    Sqnum = str(num**2)
    lsn = len(str(Sqnum))
    dec = 0

    if num==1: #1 예외적용
        return True

    for ln in range(1,lsn):
        if int(Sqnum[ln:]) != 0 : #뒤에 0인 숫자 제거
            Kaf = int(Sqnum[:ln])+int(Sqnum[ln:]) #두 부분으로 나눠서 더하기
            if Kaf==num :
                return True
    return False

2. 카프리카 상수

def kaprekar_constant(num):
    numLen = len(str(num))

    if numLen < 4:
        num = str(num)+'0'*(4-numLen) #적은 자릿수 맞춤

    if numLen > 4:
        return print('Please, input a 4-digit number') #4자리수 이상 입력안내

    KafC = int(''.join(sorted(str(num),reverse=True)))-int(''.join(sorted(str(num))))

    if KafC == 0:
        return False #같은 숫자로 구성된 값 False

    rutin = 1

    while KafC != 6174:

        if len(str(KafC)) < 4:
            KafC = str(KafC)+'0'*(4-len(str(KafC))) #1112와 같이 3자리 수가 되는 경우 오류 방지

        KafC = int(''.join(sorted(str(KafC),reverse=True)))-int(''.join(sorted(str(KafC))))
        rutin += 1

    return rutin

2019/02/14 09:13

yuong pyo lee

def kaprekar_number(num):
    if num <= 0:
        return False

    sqr = num**2
    sqr_str = str(sqr)
    for i in range(0, len(sqr_str)-1):
        a = int(sqr_str[:i+1])
        b = int(sqr_str[i+1:])
        if a != 0 and b != 0 and num == a + b:
            return True

    return num == 1

def kaprekar_constant(num):
    if num <= 0:
        return False

    count = 0
    while num != 6174:
        num_str = str(num)
        sz = len(num_str)
        if sz > 4:
            return False
        elif sz < 4:
            num_str = '0' * (4 - sz) + num_str

        low = ''.join(sorted(num_str))
        high = low[::-1]
        if low == high:
            return False

        num = int(high) - int(low)
        count += 1

    return count

def kaprekar_number_digit_all(num):
    digit = len(str(num))
    return [i for i in range(10**(digit-1), (10**digit)-1) if kaprekar_number(i)]


def kaprekar_number_low_all(num):
    return [i for i in range(1, num) if kaprekar_number(i)]

2019/02/21 11:28

ryo

#카프리카수_유형1
def kaprekar_number(n):
    mul=str(n*n)
    l=len(mul)//2
    if l<1:
        #한자리 수인 경우
        if int(mul)+0==n:
            return True
    else :
        if int(mul[0:l])+int(mul[l:])==n:
            return True
    return False

#카프리카수 유형2
def kaprekar_number2(n):
    result=[]
    for i in range(pow(10,n-1),pow(10,n)):
        if kaprekar_number(i) :
            result.append(i)
    return result

#카프리카수 유형3
def kaprekar_number3(n):
    result=[]
    for i in range(1,n+1):
        if kaprekar_number(i):
            result.append(i)
    return result

#카프리카 상수
def karprekar_constant(n):
    num=list("0"*(4-len(str(n)))+str(n))
    num.sort(reverse=True)
    n_desc=int(''.join(num))
    num.sort()
    n_asc=int(''.join(num))
    return n_desc-n_asc

def main(n):
    cnt=1
    num=n
    while cnt<=7:
        num=karprekar_constant(num) 
        if num==6174:
            return cnt
        cnt+=1
    return False

2019/02/23 01:12

쨔이

유형 1

#kaprekar

def kaptrue(n):
    a=str(n**2)
    test=0
    for i in range(len(a)):
        if i==0:
            if n==n**2:
                print("""
True. %d**2=%d,
%d=%d"""%(n,n**2,n,n))
                test=1
                break
        else:
            a1=a[:i]
            a2=a[i:]
            if int(a1)+int(a2)==n:
                print("""True.
%d**2=%d.
%s+%s=%d"""%(n,n**2,a1,a2,n))
                test=1
                break
    if test==0: print("False")

while True:
    n=int(input("Input a positive integer: "))
    kaptrue(n)

유형3

def kaptrue(n):
    a=str(n**2)
    test=0
    for i in range(len(a)):
        if i==0:
            if n==n**2:
                test=1
                return True
        else:
            a1=a[:i]
            a2=a[i:]
            if int(a1)+int(a2)==n:
                test=1
                return True
    if test==0: return False

def kaprekar(n):
    kaprekar=[]
    for i in range(1,n+1):
        if kaptrue(i):
            kaprekar.append(i)
    return kaprekar

while True:
    n=int(input("Input a positive integer: "))
    print(kaprekar(n))


2019/02/24 11:47

ykleeac

a = int(input())
b = int(input())
c = int(input())

#1
def is_Kaprekar(n):
    num = str(n**2)

    for i in range(len(num)):
        if i == 0:
            if int(num) == n:
                return 'True'
        elif int(num[:i]) + int(num[i:]) == n:
            return 'True'

    return 'False'


#2
def same_position_Kaprekar(n):
    pos = len(str(n))
    result = []
    for i in range(10 ** (pos-1), 10 ** pos):
        if is_Kaprekar(i) == 'True':
            result.append(i)
    return result


#3
def under_Kaprekar(n):
    result = []
    for i in range(1, n + 1):
        if is_Kaprekar(i) == 'True':
            result.append(i)
    return result



print(is_Kaprekar(a))
print(*same_position_Kaprekar(b), end = ' ')
print()
print(*under_Kaprekar(c), end = ' ')

2019/03/14 17:26

D.H.

# 카프리카 수인지 아닌지 판별하기
# 카프리카 수
def kaprica(n):
  sq = n ** 2
  l_sq = len(str(sq))
  if n == 1:
    return True

  for i in range(1,l_sq):
      if int(str(sq)[i:]) > 0:
        if (int(str(sq)[:i]) + int(str(sq)[i:])) == n:


          return True

  return False

# 자리수 n에 해당하는 모든 카프리수 구하기
def kaprica_decimal(n):
  for t in range(10 ** (n-1), 10 ** (n)):
    kaprica(t)

# n 이하 숫자 중 카프리카수 구하기
def kaprica_less(n):
  for k in range(1, n+1):
    if kaprica(k):
      print(k)


# 카프리카 루틴
def kaprica_routine(n):
  assert len(set(str(n))) > 1, 'set(str(n)) must be greather than 2'
  num = 0
  for i in range(n):
    if len(str(n)) != 4:
      n = int(str(n).ljust(4, "0"))
    str_max = int("".join(sorted(str(n), reverse=True)))
    str_min = int("".join(sorted(str(n))))

    num = str_max - str_min
    n = num

    if num == 6174:
      return i+1


2019/03/15 00:59

Gerrad kim

#파프리카수 :어떤수의 제곱수를 둘로 나누어 더했을때 원래 수가 되는 것
def cafDIS(orinum):
    or2=orinum**2
    cr2=str(or2)
    if len(cr2)==1:
        cr2='0'+cr2
    lg=False
    for i in range(len(cr2)-1):
        if int(cr2[0:i+1])+int(cr2[i+1:len(cr2)]) == orinum:
            lg=True
            break
    return lg

print('파프리카수 판별')
print(cafDIS(1))
print(cafDIS(9))
print(cafDIS(45))
print(cafDIS(3213))

print('자릿수가 그수인 파프리카수')
nc=int(input('자릿수 입력'))
for i in range(10**(nc-1),10**nc):
    if cafDIS(i):
        print(i)

print('그 숫자 이하인 파프리카수')
nc=int(input('숫자입력'))
for i in range(nc+1):
    if cafDIS(i):
        print(i)

2019/03/15 09:33

이이충학

julia

function isKaprekarNumber(n::Integer)
    tmp = n^2
    len = length("$tmp")

    for i in 1:length("$tmp")
        d,r = divrem(tmp,10^i)
        (r != 0 && d + r == n) && return true
    end

    return false
end

function KaprekarConst(n::Integer,i::Int=0)
    n == 6174 && return i
    n == 0 && i > 7 && return false

    tmp = sort(split("$n",""))
    length(Set(tmp)) == 1 && return false

    return KaprekarConst(
        parse(Int, rpad(join(tmp[end:-1:1]),4,"0")) - parse(Int, join(tmp)),
        i+1
    )
end

let
    @show isKaprekarNumber(297)
    @show KaprekarConst(4371)
end

2019/04/07 21:15

Creator

def kaprekar_number(n):
    string = str(n**2)
    if n**2 == n:
        return True
    else:
        for i in range(1,len(string)-1):
            if int(string[:i])+int(string[i:]) == n:
                return True
    return False



def kaprekar_constant(n):
    if n < 10 or n > 9999:
        return False

    step = 1

    while step < 8:
        numlist = []
        temp = ""
        if len(str(n)) < 4:
            temp = str(n) + "0"*(4-len(str(n)))
            numlist = list(temp)
        else:
            numlist = list(str(n))

        if int("".join(sorted(numlist,reverse=True)))-int("".join(sorted(numlist))) == 6174:
            return step
        else:
            n = int("".join(sorted(numlist,reverse=True)))-int("".join(sorted(numlist)))
            step += 1
    return False


2019/04/18 15:00

Wonjin Park

입력된 숫자 이하의 카프리카 수를 모두 출력하는 코드입니다.

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b;

            a = int.Parse(Console.ReadLine());

            while(a > 0)
            {
                b = a * a;
                //자릿수 추출

                int divide = 10;
                int i = 1;

                while (true)
                {
                    if (b >= divide)
                    {
                        i++;
                        b = b / divide;
                    }
                    else
                        break;
                }

                //앞자리 뒷자리
                int front, back; 

                //자릿수가 짝수 일때
                if (i % 2 == 0)
                {
                    divide = 10;
                    i /= 2;

                    for (int j = 1; j < i; j++)
                    {
                        divide *= 10;
                    }

                    back = (a * a) % divide;
                    front = (a * a) / divide;
                    //Console.WriteLine("{0}, {1}", front, back);

                    if (front + back == a)
                        Console.WriteLine("카프리카 수 : {0}", a);
                }
                a--;
            }
        }
    }
}

2019/05/15 17:49

와디더

def num_splitter(n):
    num_string = str(n)
    splitted_string1 = ""
    splitted_string2 = ""
    num_list = list()
    if len(num_string)>=2:
        for x in range(1,len(num_string)):
            splitted_string1 = num_string[:x]
            splitted_string2 = num_string[x:]
            if int(splitted_string1)!=0 and int(splitted_string2)!=0:
                num_list.append([int(splitted_string1), int(splitted_string2)])
        return num_list
    else:
        num_list.append([n])
        return num_list


def is_kaprekar(n): #어떤 수를 입력 받고 그 수가 카프리카 수인지 아닌지
    n_squared = n**2
    decider = num_splitter(n_squared)
    boolean_list = list()
    for x in range(len(decider)):
        if sum(decider[x])==n:
            boolean_list.append('T')
        else:
            continue
    if 'T' in boolean_list:
        return True
    else:
        return False


def all_kaprekar(n): # 어떤 수를 입력 받고 자릿수가 그 수인 모든 카프리카 수
    for i in range(10**(n-1),10**n):
        a=is_kaprekar(i)
        if a==True:
            print("{}".format(i))

def less_than_kaprekar(n): # 어떤 수를 입력 받고 그 수 이하의 모든 카프리카 수
    for i in range(1,n+1):
        a = is_kaprekar(i)
        if a==True:
            print("{}".format(i))





2019/05/22 17:36

박범수

def kaprekar_number(n):
    lis = []
    for num in range(1, n+1):
        sq_str = str(num**2).zfill(2)
        for i in range(0, len(sq_str) - 1):
            f, s = int(sq_str[:i + 1]), int(sq_str[i + 1:])
            if num == f + s:
                if s != 0:
                    lis.append(num)
    return lis

def iskaprekar_number(num):
    if num <= 0:
        return False

    sq_str = str(num**2).zfill(2)
    for i in range(0, len(sq_str)-1):
        f, s = int(sq_str[:i+1]), int(sq_str[i+1:])
        if num == f + s:
            if s != 0:
                return True
    return False

def kaprekar_constant(num, l=1):
    if l == 8: return False

    n_lis = list(str(num))

    if n_lis.count(n_lis[0]) == len(n_lis): return False

    a = ''.join(sorted(n_lis))
    b = ''.join(reversed(a))
    c = str(int(b)-int(a)).zfill(len(b))

    print(a, b, c)

    if int(c) == 6174: return l
    else: return kaprekar_constant(c, l+1)

상수에서 21은 어떻게 True가 나오는거지..

2019/06/10 16:10

이진형

카프리카 수 1, 2, 3

def kaprekar_number_1(n):
    sqr = n * n
    divisor = 1
    while divisor <= sqr * 10:
        x, y = divmod(sqr, divisor)
        if y > 0 and x + y == n:
            return True

        divisor *= 10

    return False


def kaprekar_number_2(dig):
    return [x for x in range(10**(dig-1), 10**dig) if kaprekar_number_1(x)]


def kaprekar_number_3(n):
    return [x for x in range(1, n+1) if kaprekar_number_1(x)]

카프리카 상수(재귀)

무한 재귀를 막을 필요가 없어서 간단합니다.

def kaprekar_constant(n):
    s = str(n).zfill(4)

    if s == '6174':
        return 0

    if len(set(s)) == 1:
        print(False)
        exit()

    inc, dec = ''.join(sorted(s)), ''.join(sorted(s, reverse=True))
    return 1 + kaprekar_constant(int(dec) - int(inc))

2019/07/01 15:38

Noname

카프리카 수, 유형 1번과 3번이 동시에 나오게 했습니다.

public class 카프리카수 {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);

        for(int i=2; i<=n; i++) {
            StringBuffer bf1 = new StringBuffer();
            StringBuffer bf2 = new StringBuffer();
            String[] str = Integer.toString(i*i).split("");
            int a = str.length/2;
            if(str.length%2==0) {
                for(int j=0; j<a; j++) {
                    bf1.append(str[j]);
                    bf2.append(str[a+j]);
                }
            }
            else {
                for(int j=0; j<a; j++) {
                    bf1.append(str[j]);
                    bf2.append(str[j+a]);
                }
                bf2.append(str[str.length-1]);
            }
            try {
                if(Integer.parseInt(bf1.toString())+Integer.parseInt(bf2.toString())==i) {
                    list.add(i);
                }
            }catch(NumberFormatException e) {

            } catch(Exception e) {

            }
        }
        System.out.println(list);
        int count = 0;
        for(int i=0; i<list.size(); i++) {
            if(list.get(i)==n) {
                System.out.println(true);
                count++;
                break;
            }
        }
        if(count==0) {
            System.out.println(false);
        }
    }
}

카프리카 상수

public class 카프리카상수 {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        String[] str = scan.nextLine().split("");
        int[] arr = Arrays.stream(str).mapToInt(Integer::parseInt).toArray();

        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<arr.length; i++) {
            list.add(arr[i]);
        }
        if(list.size()<4) {
            int k = list.size();
            for(int i=0; i<4-k;i++) {
                list.add(0);
            }
        }
        int count = 0;
        boolean check = true;
        for(int i=0; i<7; i++) {
            count++;
            Collections.sort(list);
            String s1 = list.stream().map(Object::toString).collect(Collectors.joining(""));
            Collections.reverse(list);
            String s2 = list.stream().map(Object::toString).collect(Collectors.joining(""));
            int a = Integer.parseInt(s2)-Integer.parseInt(s1);
            if(a==6174) {
                System.out.println(count);
                check = false;
                break;
            }
            list.clear();
            String[] str2 = Integer.toString(a).split("");
            for(int j=0; j<str2.length; j++) {
                list.add(Integer.parseInt(str2[j]));
            }
        }
        if(check) {
            System.out.println(false);
        }
    }
}

찾아보니 숫자 하나로만 이루어지지 않은 4자리 숫자라면 모든 수는 카프리카 상수 6174에 도달하게 된다네요.. 저는 그냥 풀었습니다...그래서 코드가 보기 불편할 것 같아요.. 리스트sort와 reverse를 이용해서 reverse(내림차순)-sort(오름차순)을 하고 이 값을 다시 list에 저장하는 방법으로 하였습니다. 그리고 입력값이 4자리가 아니면 list에 0을 부족한 만큼 추가하였습니다.

2019/12/21 20:16

big Ko

#유형1(카프리카 수인지 아닌지 확인)
n=input("양의 정수 n을 입력하십시오: ")
def KN(n):
    num=int(n)**2
    if int(n)==1: #1도 카프리카 수
        return True
    elif any([int(str(num)[:i+1])+int(str(num)[i+1:])==int(n) for i in range(len(str(num))-1) if int(str(num)[i+1:])!=0]): #제곱해서 두 부분으로 나눈 수 중 하나가 0이 아니면서 두 부분의 합이 원래 수가 되는 경우가 하나라도 있으면 True
        return True
    else:
        return False
print(KN(n))

#유형2(자릿수를 입력했을 때 그 자릿수를 가지는 카프리카 수 출력)
pn=int(input("자리수를 입력해주십시오: "))
def KPN(pn):
    return list(num for num in range(10**(pn-1),10**pn) if KN(num)) 
print(KPN(pn))

#유형3(어떤 수 이하의 모든 카프리카 수 출력)
un=int(input("양의 정수 n을 입력하십시오: "))
def KPUN(un):
    return list(num for num in range(1,un+1) if KN(num))  
print(KPUN(un))

#유형4(몇 번 이내에 카프리카 상수(6174)가 완성되었는가?)
fn=input("4자리 숫자를 입력하십시오: ")
def KC(fn):
    if len(fn)!=4 or len(set(str(fn)))==1:
        return False
    t=0
    while fn!=6174: #일단 들어가는 fn이 문자열이니 6174를 입력해도 while루프를 돌아 t=1로 나온다.(6174의 경우 1번 실행해도 6174가 된다.)
        lst=sorted(list(map(str,str(fn))))
        fn=int("".join(lst)[::-1])-int("".join(lst))
        t+=1
    return t
print(KC(fn))

카프리카 상수에서 6174는 카프리카 루틴을 1번 돌아도 6174니까 1을 출력하게 했습니다.

2020/01/20 12:43

박시원

def kaprekar_number(x):
    for i in range (1,x+1):
        for j in range (0,len(str(i**2))):
            a=i**2//10**j
            b=i**2%10**j
            if a+b==i:
                if a>0 and b>0:
                    print (i,'...',i,'^2','=',i**2,'=>',a,'+',b,'=',a+b)

kaprekar_number(int(input('Input a number....')))

2020/03/30 12:45

Buckshot

<결과> Input a number....10000 9 ... 9 ^2 = 81 => 8 + 1 = 9 45 ... 45 ^2 = 2025 => 20 + 25 = 45 55 ... 55 ^2 = 3025 => 30 + 25 = 55 99 ... 99 ^2 = 9801 => 98 + 1 = 99 297 ... 297 ^2 = 88209 => 88 + 209 = 297 703 ... 703 ^2 = 494209 => 494 + 209 = 703 999 ... 999 ^2 = 998001 => 998 + 1 = 999 2223 ... 2223 ^2 = 4941729 => 494 + 1729 = 2223 2728 ... 2728 ^2 = 7441984 => 744 + 1984 = 2728 4879 ... 4879 ^2 = 23804641 => 238 + 4641 = 4879 4950 ... 4950 ^2 = 24502500 => 2450 + 2500 = 4950 5050 ... 5050 ^2 = 25502500 => 2550 + 2500 = 5050 5292 ... 5292 ^2 = 28005264 => 28 + 5264 = 5292 7272 ... 7272 ^2 = 52881984 => 5288 + 1984 = 7272 7777 ... 7777 ^2 = 60481729 => 6048 + 1729 = 7777 9999 ... 9999 ^2 = 99980001 => 9998 + 1 = 9999 - Buckshot, 2020/03/30 12:45
def kaprekar_number(N):
    M = N**2
    if len(str(M)) == 1:
        if M == N:return True
        elif M != N:return False
    elif len(str(M)) % 2 == 0:
        h = int(str(M)[:int(len(str(M))/2)]) + int(str(M)[int(len(str(M))/2):])
        if h == N:return True
        elif h != N:return False
    elif len(str(M)) % 2 == 1:
        h1 = int(str(M)[:int(len(str(M))/2)]) + int(str(M)[int(len(str(M))/2):])
        h2 = int(str(M)[:int(len(str(M))/2)+1]) + int(str(M)[int(len(str(M))/2)+1:])
        if h1 == N or h2 == N:return True
        elif h1 != N and h2 != N:return False
def kaprekar_constant(N):
    p,line = 0,0
    if len(str(N)) != 4:

        p = 4 - len(str(N))
    while True:
        line += 1
        Nstr,Mstr = "",""
        Nlist,Mlist = list(str(N)),list(str(N))
        truefalsecheck = 0
        check = int(str(N)[0])
        for j in range(p):
            Nlist.append('0')
            Mlist.append('0')
        p = 0
        for i in range(len(Nlist)):
            Nlist[i] = int(Nlist[i])
        for i in range(len(str(N))):
            if int(str(N)[i]) == check:
                truefalsecheck += 1
        if truefalsecheck == len(str(N)):return False
        elif truefalsecheck != len(str(N)):
            Nlist.sort()
            Mlist.sort()
            Mlist.reverse()             
            for j in range(len(Nlist)):
                Nstr += str(Nlist[j])
                Mstr += str(Mlist[j])
            if int(Mstr) - int(Nstr) == 6174:return line
            elif int(Mstr) - int(Nstr) != 6174:
                N = int(Mstr)-int(Nstr)
print(kaprekar_number(int(input())))
print(kaprekar_constant(int(input())))

2020/04/16 16:46

BlakeLee

def kaprekar_number(k):
    for num in k:
        kn = str(num**2)
        len_num, len_kn = len(str(num)), len(kn)
        if len_kn < 2 and (0+num**2) == num:
            print('True')
        elif (len_kn == 2 and len_num == 1) and (int(kn[:1])+int(kn[1:]) == num):
            print('True')
        elif len_kn > 2:
            for i in range(len_num, 0, -1):
                if int(kn[:len_num]) + int(kn[len_num:]) == num:
                    print('True')
        else: print('False')

if __name__ == '__main__':
    k = [1, 9, 45, 55, 99, 297, 703, 999, 2223, 2728,
         4879, 4950, 5050, 5292, 7272, 7777, 9999, 17344,
         22222, 38962, 77778, 82656, 95121, 99999, 142857,
         148149, 181819, 187110, 208495, 318682, 329967,
         351352, 356643, 390313, 461539, 466830, 499500,
         500500, 533170] # 모두 다 카프리카 수
    kaprekar_number(k)

2020/05/18 13:14

Hwaseong Nam

class kaprekar() :

    def isKaprekar(self, n1) :
        nSq = str(n1**2)
        for i in range(0, len(nSq)-1) :
            if (int(nSq[:i+1])+int(nSq[i+1:])) == n1 : return True
        return False

    def searchKaprekarByDigit(self, n2) :
        result = []
        for d in range(10**(n2-1), 10**(n2)) :
            if self.isKaprekar(d) == True : result.append(d)
        return result

    def searchKaprekarUnder(self, n3) :
        result = []
        for u in range(1, n3+1) :
            if self.isKaprekar(u) == True : result.append(u)
        return result

if __name__ == "__main__" :
    a = kaprekar()
    print(a.isKaprekar(45))
    print(a.isKaprekar(99))
    print(a.isKaprekar(4879))
    print(a.isKaprekar(533160))
    print(a.searchKaprekarByDigit(4))
    print(a.searchKaprekarUnder(461539))

for를 이용해서 하나하나 확인하는 만큼 자릿수가 늘어나면 시간이 오래걸리네요.

결과

True
True
True
False
[1000, 2223, 2728, 4879, 4950, 5050, 5292, 7272, 7777, 9999]
[9, 10, 45, 55, 99, 100, 297, 703, 999, 1000, 2223, 2728, 4879, 4950, 5050, 5292, 7272, 7777, 9999, 10000, 17344, 22222, 38962, 77778, 82656, 95121, 99999, 100000, 142857, 148149, 181819, 187110, 208495, 318682, 329967, 351352, 356643, 390313, 461539]

2020/09/14 14:43

GG

카프리카 수 인지 확인하는 함수

def kaprekar_number(number): square = number ** 2 str_square = str(square) if square > 9: for x in range(1, len(str_square) - 1): if int(str_square[:x]) + int(str_square[x:]) == number: return 'True' return 'False' else: if square == number: return 'True' return 'False'

입력받은 수를 작은순서대로 정렬해주는 함수

def make_sorted_number(number): temp = '' for x in sorted(str(number)): temp += x while len(temp) < 4: temp += '0' return int(temp)

입력받은 수를 큰 순서로 정렬해주는 함수

def make_reversed_number(number): temp = '' for x in reversed(sorted(str(number))): temp += x while len(temp) < 4: temp = '0' + temp return int(temp)

카프리카 상수 확인하는 함수

def kaprekar_constant(number): count = 0 while make_reversed_number(number) - make_sorted_number(number) != 6174: if number > 1000 and number % 1111 == 0: return "False" elif 1000 > number > 100 and number % 111 == 0: return "False" elif 10 < number < 100 and number % 11 == 0: return "False" else: number = abs(make_reversed_number(number) - make_sorted_number(number)) count += 1 return count + 1```{.python}

카프리카 수 인지 확인하는 함수

def kaprekar_number(number): square = number ** 2 str_square = str(square) if square > 9: for x in range(1, len(str_square) - 1): if int(str_square[:x]) + int(str_square[x:]) == number: return 'True' return 'False' else: if square == number: return 'True' return 'False'

입력받은 수를 작은순서대로 정렬해주는 함수

def make_sorted_number(number): temp = '' for x in sorted(str(number)): temp += x while len(temp) < 4: temp += '0' return int(temp)

입력받은 수를 큰 순서로 정렬해주는 함수

def make_reversed_number(number): temp = '' for x in reversed(sorted(str(number))): temp += x while len(temp) < 4: temp = '0' + temp return int(temp)

카프리카 상수 확인하는 함수

def kaprekar_constant(number): count = 0 while make_reversed_number(number) - make_sorted_number(number) != 6174: if number > 1000 and number % 1111 == 0: return "False" elif 1000 > number > 100 and number % 111 == 0: return "False" elif 10 < number < 100 and number % 11 == 0: return "False" else: number = abs(make_reversed_number(number) - make_sorted_number(number)) count += 1 return count + 1 ```

2020/11/04 15:12

고태욱

def kn(a1):
    a = a1**2
    b = len(str(a))
    c = str(a)
    if b == 1:
        if a1 == a:
            return True
        else:
            return False 
    for i in range(1,b):
        d = c[0:i]
        e = c[i:b]
        f = int(d)+int(e)
        if f == a1:
            return(True)
    return(False)

print(kn(1))
print(kn(45))
print(kn(297))
print(kn(3213))


def kc(a):
    count = 0
    a = str(a)
    a1 = a[0:2]
    a2 = a[2:4]
    if a1 == a2:
        print(False)
        return
    while True:
        a += '0'*(4-len(a))
        a = ','.join(a)
        a = a.split(',')
        a.sort()
        sortd = a[:]
        a.reverse()
        reverd = a[:]
        sortd = ''.join(sortd)
        reverd = ''.join(reverd)
        count += 1
        minus = int(reverd)-int(sortd)
        if 6174 != minus:
            a = str(minus)
            continue
        print(f'반복 횟수는 {count} 입니다')
        break


kc(4371)
kc(21)
kc(1)
kc(1111)


2021/11/03 14:43

한고선

#카프리카 수
def kaprekar_number(data):
    value = str(data**2)
    sum = 0
    if len(value) % 2 != 0:
        value = '0'+value  
    sum = int(value[:len(value)//2]) + int(value[len(value)//2:])
    if data == sum:
        return True
    else:
        return False
    #print(sum)

print(kaprekar_number(45))
print(kaprekar_number(297))
print(kaprekar_number(1))
print(kaprekar_number(3213))
print(kaprekar_number(5))

# 입력한수 이하 카프리카 수

input_data = int(input("수을 입력 하세요 : "))

value = list(i for i in range(1,input_data+1) if kaprekar_number(i))
print(value)


#카프리카 상수
def kaprekar_const(data):
    for i in range(1,8):
        value = str(data)
        value1 = (''.join(sorted(value)))
        value2 = (''.join(reversed(sorted(value))))
        data = int(value2)-int(value1)
        if data == 6174 and i <=7:
            print(i, data)
            return True


print(kaprekar_const(1342))

2021/12/25 22:46

semipooh

# 카프리카 수

import re


def kprekar_number(a):
    a_pow = str(a**2)
    if len(a_pow)==1:
        if a ==1 :
            return True
        else:
            return False
    else:
        for k in range(1,len(a_pow)):
            if int(a_pow[:k])+int(a_pow[k:])==a and int(a_pow[k:])>0:
                return True
                break
            if k==len(a_pow)-1:
                return False
                break

print(kprekar_number(1))
print(kprekar_number(45))
print(kprekar_number(297))
print(kprekar_number(3213))

#카프리카 상수


def convert (a):
    a = str(a)
    if len(a) ==4:
        return a
    else:
        while len(a)<4:
            a= '0'+a
        return a

def fun1 (a):
    a = convert(a)
    sort_str ="".join(sorted(list(str(a))))
    rev_str = "".join(reversed(sorted(list(str(a)))))
    return int(rev_str)-int(sort_str)

def kaprekar_constant (a):
    n= a
    for i in range(1,9):
        if i==8:
            return False
            break       
        if fun1(n) == 6174:
            return i
            break
        else:
            n = fun1(n)

print(kaprekar_constant(4371))
print(kaprekar_constant(21))
print(kaprekar_constant(1))
print(kaprekar_constant(1111))

2022/01/20 04:40

양캠부부

카프리카 수

package org.javaturotials.ex;
import java.util.*;
import java.util.stream.Collectors;

public class test {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int input = sc.nextInt();
        for(int z=1; z<=input; z++) {
        int num = z;
        String str = String.valueOf((int)Math.pow(num, 2));
        String[] arr = str.split("");
        String at = "";
        String bt = "";
        for(int i=0; i<arr.length; i++) {
            if(i+1<=arr.length/2) {
                at+=arr[i];
            }
            if(i+1>arr.length/2){
                bt+=arr[i];
            }
            }
        int result=0;
        if(arr.length==1) {result=num;}
        else{
            result = Integer.valueOf(at)+Integer.valueOf(bt);
        }

        if(result == num) {
            System.out.println(z);
        }
        }
    }
    }

카프리카 상수

package org.javaturotials.ex;
import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

import javax.lang.model.type.ArrayType;

public class test {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int count=0;
        String result="";
        String ss = "6174";
        String num =sc.next();
        int fx=0;
        if(num.length()==4) {
            while(true) {
            String[] arr = num.split("");
            int[] irr = new int[arr.length];
            Integer[] err = new Integer[arr.length];
            for(int i=0; i<arr.length; i++) {
                irr[i] = Integer.valueOf(arr[i]);
                err[i] = Integer.valueOf(arr[i]);
                for(int j=0; j<arr.length; j++) {
                    if(i!=j) {
                    if(arr[i]!=arr[j]) {
                        fx++;}
                    }
                }
            }
            if(fx==3) {break;}
            Arrays.sort(irr);
            Arrays.sort(err, Collections.reverseOrder());
            String at = "";
            String bt = "";
            for(int k=0; k<irr.length; k++) {
                at+=irr[k];
                bt+=err[k];
            }

            int sum = (int)Math.abs(Integer.valueOf(bt) - Integer.valueOf(at));
            String sums = String.valueOf(sum);
            if(sums.length()<4) {
                sums = String.valueOf(0*(4-sums.length())) + sums;
            }
            count++;
            if(sums.equals(ss)==true) {break;}
            num=sums;
        }
        }
        if(fx==0) System.out.println(false);
        else System.out.println(count);
    }
    }

2022/02/23 22:06

Kkubuck

def kaprekar_number(num):
    nn = str(num*num).zfill(2)
    print(' =' * 10)
    print('%d x %d = %s' %(num, num, nn))
    for i in range(1, len(str(num)) + 1):
        if int(nn[:i]) + int(nn[i:]) == num:
            print('%s + %s = %d' %(nn[:i], nn[i:], num))
            return True
    return False

def kaprekar_constant(num):
    nn = str(num).zfill(4)
    if len(set(nn)) < 2 or len(nn) != 4:
        return "False"
    cnt = 0
    while num != 6174 and cnt < 100:
        cnt += 1
        nn = str(num).zfill(4)
        num = int(''.join(sorted(nn)[::-1])) - int(''.join(sorted(nn)))
    if cnt == 100:
        return '100회 까지 안나와요!!'
    return str(cnt)



# 입력 (유형 1)
print(kaprekar_number(1))
print(kaprekar_number(45))
print(kaprekar_number(297))
print(kaprekar_number(3213))

# 카프리카 상수
print("\n\n 카프리카 상수")
print(kaprekar_constant(4371))
print(kaprekar_constant(21))
print(kaprekar_constant(1))
print(kaprekar_constant(1111))

2023/08/17 22:04

insperChoi

목록으로