n Kaprekar 수 계산


12

카프리 카 수는 n 형 자리 숫자 인 K , 그 때 제 N 또는 N-1 (2)가 제에 첨가 ^ (k)의 숫자 N N ^ 2의 숫자 결과이다 N.

예 :

9^2 = 81.  8+1 = 9.
45^2 = 2025.  20+25 = 45.
297^2 = 88,209. 88+209 = 297

카프 레카 시퀀스는 1에서 시작합니다.

n 이 1에서 100 사이의 범위에 있지만 첫 번째 n 카프 레카 수 를 계산하고 출력하는 프로그램을 작성하십시오 . 각 카프 레카 수는 공백으로 분리해야하며 다른 것은 없어야합니다.

더 카프리 카 수를 찾을 수 있습니다 여기 에 대한 프로그램을 확인하지만,이 자원은 계산을 돕기 위해 어떤 방식으로 사용되지 않을 수도 있습니다 - 즉, 아니 하드 코딩,이 소스에서 읽기, 또는 기타 착취에서 사용 방법-모든 숫자는 프로그램에서 생성해야합니다.

가장 짧은 코드가 승리합니다.


@devnull이게 더 낫습니까? 프로그램이 n최대 100 개를 지원해야 함을 의미합니다 .

MathWorld의 정의A006886 과 충돌 합니다 (MathWorld는 m 이 원래 숫자의 길이임을 지정하고 A006886은 최소 숫자를 지정 함 ). 첫 번째 단락의 정의는 둘 다와 약간 다릅니다.
primo

@primo 좋아요, 지금 알겠습니다. 수정합니다.

아, 네 말이 맞아 그것들은 동등한 진술입니다. 그러나 두 정의가 동일하지 않다는 점에 유의해야합니다. 4879 는 첫 번째 카운터 예입니다 (사각형은 4 : 4가 아닌 3 : 5로 분할 됨).
primo 2019

@primo이게 더 낫습니까? 따라서 숫자의 제곱 길이는 숫자 길이의 두 배 또는 숫자 길이의 두 배에 1을 더한 것과 같아야합니까?

답변:


5

펄-63 바이트

#!perl -l
map{1while$l=length++$_,$_**2=~/.{$l}$/,$`+$&^$_;print}($_)x<>

shebang을 1 바이트로 계산합니다. 에서 입력을받습니다 stdin.

이것은 n ≤ 50에 허용되는 런타임을 가지며 , 그 후 약간 느립니다.

샘플 사용법 :

$ echo 20 | perl kaprekar.pl
1
9
45
55
99
297
703
999
2223
2728
4950
5050
7272
7777
9999
17344
22222
77778
82656
95121

런타임에 문제가 없습니다. 이것은 단지 코드 골프입니다.

4

C, 109 106

long long i=1;x=10,n;main(){scanf("%d",&n);for(;n;x*=x<=++i?10:1)(i-i*i/x-i*i%x)||printf("%lld ",i,n--);}
  • n17까지가를 제거하기 위해 확인 될 것이다 long long,
  • 초과 printf 매개 변수가 남용되었습니다.)
  • 삼항 연산자에서 빈 명령문을 사용할 수없는 이유는 무엇입니까? 둘 1은 어리석은 ...
  • 3 명의 캐릭터에 대해 Josh에게 감사드립니다.

1
거짓 값만 신경 쓰면 삼항 명령문 대신 부울 논리를 사용할 수 있습니다. 예 (i-i*i/x-i*i%x)||printf(...).
Josh

1
루프 대신 초기화 x하고 i전역 범위 for에서 몇 문자를 저장할 수도 있습니다.
Josh

3

매쓰 144 154

k@m_:=((x=m^2)-(w=FromDigits[Take[IntegerDigits@x,y=-IntegerLength@m]]))*10^y+w==m;
g@n_:=(s={};i=0;While[Length@s<n,If[k@i,s=Append[s,i]];i++];s)   

테스트

g[14]

0
1
9
45
55
99
297
703
999
2,223
2,728
4,950
5,050
7,272


출력이 기준을 충족하지 않습니다. 각 Kaprekar 번호는 공백으로 구분해야합니다.
RononDex

RononDex. 출력을 조정했습니다.
DavidC

3

자바 스크립트 96

for(i=0,n=prompt(s='');n;i++){t=''+i*i;if(t.substr(0,l=t.length/2)==i-t.substr(‌​l))n--,s+=i+' '}s

출력 :

0 1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121 99999 142857 148149 181819 187110 208495 318682 329967 351352 356643 390313 461539 466830 499500 500500 533170 538461 609687 643357 648648 670033 681318 791505 812890 818181 851851 857143 961038 994708 999999 

입력은 최대 값이 아니라 출력 할 값의 수를 지정합니다.
primo

그것을 놓쳤다!
Michael M.

1
96 :for(i=0,n=prompt(s='');n;i++){t=''+i*i;if(t.substr(0,l=t.length/2)==i-t.substr(l))n--,s+=i+' '}s
Florent

Bien joué Florent :)
Michael M.

왜 값을 배열에 저장하고 단순히 결합하지 않습니까?
Ismael Miguel

3

파이썬-98

나는 몇 가지 문자를 면도하기 위해 멋진 파이썬 슬라이스를 사용했습니다.

i=n=0
while n<20:
 i+=1;s=str(i**2);l=-len(str(i))
 if int("0"+s[:l])+int(s[l:])==i:print(i);n+=1

좋은 작업. 오늘 투표권이 떨어졌지만 한 시간 안에 투표를하겠습니다.

3

C #-255 자

int x=100;decimal k=0;while(x>0){k++;decimal d=k*k;string s=d.ToString("n").Replace(",","").Split('.')[0];int g=k.ToString().Length;int h=s.Length;if(k==d||(h!=g&&long.Parse(s.Substring(h-g))+long.Parse(s.Substring(0,h-g))==k)){Console.Write(k+" ");x--;}}

x는 코드에서 찾을 Kaprekar 숫자의 수입니다. 이것은 1에서 100까지의 범위에서 테스트되었지만 이보다 더 많은 것을 지원해야합니다. 처음 50 개는 약 1 초 밖에 걸리지 않았지만 100 개 숫자는 2 시간 반이 걸렸습니다.

산출:

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 
82656 95121 99999 142857 148149 181819 187110 208495 318682 329967 351352 356643 
390313 461539 466830 499500 500500 533170 538461 609687 643357 648648 670033 
681318 791505 812890 818181 851851 857143 961038 994708 999999 4444444 4927941 
5072059 5555556 9372385 9999999 11111112 13641364 16590564 19273023 19773073 
24752475 25252525 30884184 36363636 38883889 44363341 44525548 49995000 50005000 
55474452 55636659 61116111 63636364 69115816 74747475 75247525 80226927 80726977 
83409436 86358636 88888888 91838088 94520547 99999999 234567901 332999667 
432432432 567567568 667000333 765432099 999999999 1111111111 1776299581 2020202020 
3846956652 3888938889 4090859091 4132841328 4756047561

이 코드를 정리하면 다음과 같습니다.

        int x = 100;
        decimal k = 0; 
        while (x > 0) 
        {
            k++;
            decimal d = k * k;
            string s = d.ToString("n").Replace(",", "").Split('.')[0];
            int g = k.ToString().Length; 
            int h = s.Length; 

            if (k == d || (h != g && long.Parse(s.Substring(h - g)) + long.Parse(s.Substring(0, h - g)) == k) )
            { 
                Console.Write(k + " "); x--; 
            } 
        }

이것이 더 짧아 질 수 있는지 알고 싶습니다.


3

C, 90 76 75 바이트

long long d,r=1;k(n){for(;++d/r?r*=10:--n;d-d*d/r-d*d%r||printf("%d ",d));}

2

Python 2.7, 144 (줄 바꾸기 포함)

def c(c):
 l="1";i=2;u=1
 while u<c:
  r=str(i**2);w=len(r)
  if w>1:
   if i==int(r[:w/2])+int(r[w/2:]):
    l+=" "+str(i);u+=1
  i+=1
 print l

c = 10에 대한 출력 :

1 9 45 55 99 297 703 999 2223 2728

u = 20에 대한 출력 :

1 9 45 55 99 297 703 999 2223 2728 4950 5050 7272 7777 9999 17344 22222 77778 82656 95121

으악! 지금 고쳤습니다. 약간 길지만 정확합니다. 파이썬에서 세미콜론을 발견했습니다! 만세!
KBKarma

2
그러면 7 번 줄이 이전 줄의 끝으로 갈 수 있습니다.
primo

아 아 젠장 오 잘 파이썬에 대한 나의 지식이 가장 빈약하다는 것을 고려할 때 점심 시간 동안 함께 두드린 일에 여전히 좋습니다.
KBKarma

2

R, 99 자

k=n=0;N=scan();while(n<N){k=k+1;j=k^2;i=10^ceiling(nchar(j)/2);if(k==j%/%i+j%%i){cat(k," ");n=n+1}}

으로 i의 자리 수의 절반 인 k^2라운드 업 거세한 숫양 K의 평가는 카프리 카 수는 몫과의 정수 나눗셈의 나머지를 추가하여 현재 수행되고있다 k^2작성자 10^i(자릿수의 왼쪽 절반 인 몫 내림 및 나머지 오른쪽 반올림).


2

bash + sed, 75 자

Bash는 정수 전용 산술을 수행하며 숫자를 10 진수 문자열로 나타냅니다. 이러한 속성은이 도전에 골프를 치는 데 도움이됩니다. 또한 선언되지 않은 / 지정되지 않은 변수는 산술을 수행 할 때 값이 0 인 것으로 가정합니다.

for((;s=++i*i,l=${#s}/2,1;));{
((${s:0:l}+10#${s:l}-i))||echo $i
}|sed $1q

그것은 10#거기 에 넣도록 자극 했지만 분할의 후반이로 시작하면 이와 같은 것이 필요합니다 0. 산술을 할 때 는 밑이 명시 적으로 명시되지 않는 한 이러한 숫자를 8 진수로 처리합니다.

$ ./kaprekar.sh 10
1
9
45
55
99
297
703
999
2223
2728
$ 

1

파이썬 3.3-117 자

n=int(input())
p=1
while n>0:
    v=str(p**2)
    l=len(v)
    if p==int(v[l//2:])+int('0'+v[:l//2]):
        print(p)
        n-=1
    p+=1

각 들여 쓰기 수준과 마지막 줄을 제외한 각 줄 바꿈은 모두 1 문자로 계산됩니다. 나는 그것이 파이썬 코드에 공평하다고 생각합니다. 이 스크립트는 사용자가 계산할 Kaprekar 수를 입력해야합니다.


1

J-64

못 생겼지 만 여전히. 백만까지의 모든 숫자를 확인한 다음 사용 n하므로 n <= 50에 대해서만 작동합니다.

n{.}.I.(]=+/&;&:(10&#.&.>)&(<.@-:@#({.;}.)])&(10&#.inv@*:))i.1e6

n 입력을 넣을 위치입니다


스펙에서는 최대 100 개를 계산한다고합니다. 찾은 카프 레카 수의 수를 세기 위해 다른 변수를 추가하기 위해 많은 문자를 추가하지는 않을 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.