计算n个Kaprekar数


12

卡布列克数为n位数字ķ的是,当第一Ñn-1个位k的^ 2被添加到第二Ñ的N ^ 2位数,则结果为N.

例子:

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

Kaprekar序列从1开始。

编写一个程序,计算并输出前n个 Kaprekar数,其中n在1到100的范围内,但不限于此。每个Kaprekar数必须用空格分隔,不能有其他空格。

您可以在此处找到更多的Kaprekar编号来检查您的程序,但是不得以任何方式使用此资源来帮助进行计算-换句话说,请勿进行硬编码,从此源读取或在任何其他漏洞利用程序中使用它方式-所有数字都必须由您的程序生成。

最短的代码获胜。


@devnull这样好吗?这意味着程序必须支持n高达至少100

MathWorld的定义A006886冲突(MathWorld指定m为原始数字的长度,A006886指定其至少为该数字的长度)。您在第一段中的定义与两者略有不同。
primo 2014年

@primo好,我明白了。会修改。

啊,你是对的。它们是等效的语句。但应注意,这两个定义并不相同。4879是第一个计数器示例(正方形以3:5分割,而不是4:4)。
primo 2014年

@primo这样好吗?因此,数字平方的长度必须等于数字长度的两倍,或者等于数字长度的两倍加1?

Answers:


5

Perl-63字节

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

将shebang计为一个字节。输入来自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--);}
  • n多达17这将是确定删除long long
  • 超出的printf参数被滥用:)
  • 为什么在三元运算符中不能使用空语句?这两个1很傻...
  • 感谢Josh附加的3个字符...

1
如果只关心错误值,则可以使用布尔逻辑而不是三元语句。例如(i-i*i/x-i*i%x)||printf(...)
2014年

1
您还可以在全局范围内进行初始化xi而不是在for循环中进行保存,以节省几个字符。
2014年

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
2223
2728
4950
5050
7272


您的输出不符合标准。每个Kaprekar数字都必须用空格分隔,不能有其他任何分隔。
RononDex

RononDex。我调整了输出。
DavidC 2014年

3

Javascript 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 2014年

错过了,固定!
Michael M.

1
96for(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
弗洛伦特

BienjouéFlorent :)
Michael M.

为什么不将值存储在数组中并简单地将它们连接起来?
Ismael Miguel 2014年

3

蟒蛇-98

我使用了一些不错的python切片功能来剃掉一些字符。

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,但应该支持更多的功能。100个号码需要花两个半小时才能返回,尽管前50个只花了大约1秒的时间-之后情况逐渐放慢。

输出:

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

哎呀!立即修复。稍长一些,但正确。我在Python中发现了分号!欢呼!
KBKarma 2014年

2
然后,这会让您大吃一惊:第7行可以在上一行的末尾进行。
primo 2014年

哦 啊,该死。那好吧。考虑到我对Python的了解充其量是微不足道的,所以对于我在午休时间一起敲门的东西还是很不错的。
KBKarma 2014年

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^210^i(商为的数字的左半向下舍入和其余的右半部分四舍五入)。


2

bash + sed,75个字符

Bash仅执行整数运算,并将数字表示为十进制字符串;这些属性有助于打高尔夫球。此外,在进行算术运算时,未声明/未分配的变量也被假定为值为0。

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

我很讨厌把放进10#去,但是如果拆分的后半部分以a开头,则需要这样的操作0。在进行算术运算时,除非明确说明了基数,否则会将这些数字视为八进制。

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

1

Python 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个字符。我认为这对于Python代码是公平的。该脚本希望用户输入要计算的Kaprekar数字的数量。


1

J 64

有点丑陋,但仍然如此。它检查所有不超过一百万的数字然后取走n,因此仅适用于n <= 50。

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

n 在哪里输入


在规格中,它表示最多可以计算100个。可能不会添加那么多字符来添加另一个仅用于计算发现的Kaprekar数字的数量的变量。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.