铁面无私


9

不可触碰的数字α

不可触摸数字是一个正整数,不能表示为任何正整数的所有适当除数的总和(包括不可触摸数字本身)。

例如,数字4是不可触摸的,因为它等于9:1 + 3 = 4的适当除数的总和。数字5是不可触摸的,因为它不是任何正整数的适当除数的总和。5 = 1 + 4是将5写为包括1的不同正整数之和的唯一方法,但是如果4除以一个数字,则2也是如此,因此1 + 4不能是任何数字的适当除数的和(因为因素列表必须同时包含4和2)。

人们认为数字5是唯一的不可触摸的奇数,但这尚未得到证明:哥德巴赫猜想的一个更​​强的版本将紧随其后。β

保罗·埃尔德斯(PaulErdős)证明了无数个不可动摇的数字。

不可触摸的一些属性:

  • 没有碰到的东西比素数大1
  • 除5外,其他所有元素都不能比素数大3
  • 没有碰到的是一个完美的数字
  • 到目前为止,除2和5之外的所有不可触摸内容都是复合的。

目的

创建一个程序或函数,该程序或函数n通过标准输入或函数参数获取自然数并打印第一个n不可触摸的数。

输出必须在数字之间有分隔符,但是可以是任何分隔符(例如,换行符,逗号,空格等)。

这至少应该能够工作1 <= n <= 8153。这是基于在b文件为OEIS项中提供的事实γ上升到n = 8153

像往常一样,不允许出现标准漏洞。

示例I / O

1    -> 2
2    -> 2, 5
4    -> 2, 5, 52, 88
10   -> 2, 5, 52, 88, 96, 120, 124, 146, 162, 188
8153 -> 2, 5, 52, 88, 96, 120, ..., ..., ..., 59996

这是 ,因此赢得最少的字节数。


α- 维基百科 β- MathWorld γ- OEIS


由于某种原因,这被标记为“查找半完美数字”问题的重复项,但是任务却完全不同。在这种情况下,必须检查以确保任何自然数的理想除数之和不能等于某个数。


这纯粹是推测性的,因为我还没有真正考虑过如何解决这个问题:如果我假设结果数的上限会欺骗吗?说,如果我编写的代码只能找到多达60,000个不可触及的数字?这足以覆盖输入范围。但是当然,我仅根据您提供的部分结果知道这一点。
Reto Koradi

我想会没事的。据我所知,这不是技术上对结果进行硬编码,也不违反标准漏洞。只要符合其余规格,就可以了。
卡德2015年

@vihan绝对不是。
卡德2015年

Answers:


6

Pyth,21个字节

.f!fqZsf!%TYStTSh^Z2Q

警告:非常慢。在下面测试运行和计时。

$ time pyth -c '.f!fqZsf!%TYStTSh^Z2Q' <<< 3
[2, 5, 52]

real    2m46.463s
user    2m46.579s
sys 0m0.004s

它基本上是蛮力的,对分解进行测试,直到潜在的孤独数平方加一。


4

C,104字节

j,i,z,w;u(y){for(z=2;y;z++)for(w=0;(++w<z*z||0&printf("%i ",z)+y--)&&j^z;)for(i=j=0;++i<w;j+=i*!(w%i));}

y > 20 会花费几分钟,但无论如何。


2

Java,310字节

class U{int[] p;U(int e){p=new int[(int)4e9];for(int i=1,c=0;c<e;i++)if(u(i)>0){System.out.println(i);c++;}}int p(int n){if(p[n]!=0)return p[n];int i,s=1;for(i=2;i<=n-1;i++)s+=n%i==0?i+(n/i!=i?n/i:0):0;return(p[n]=s);}int u(int n){if(n==1)return 0;for(int i=2;i<=(n-1)*(n-1);i++)if(p(i)==n)return 0;return 1;}}

尽我所能打高尔夫球,但是我对确保它在合理的时间内跑起来更感兴趣。未修饰的版本可能更有趣

public class Untouchable {
    int[] properDivisorSumMap;


    public Untouchable(int estimatedMaxium){
        properDivisorSumMap = new int[(estimatedMaxium-1)*(estimatedMaxium-1)];
    }


    public int properDivisorSum(int n){
        if(properDivisorSumMap[n] != 0){
            return properDivisorSumMap[n];
        }

        int sum = 1;
        for(int i=2;i<=(int)Math.sqrt(n);i++){
            if(n%i==0){
                sum+=i;
                if(n/i != i){
                    sum+=n/i;
                }
            }
        }
        properDivisorSumMap[n] = sum;
        return sum;
    }


    public boolean untouchable(int n){
        if(n==1){
            return false;
        }
        for(int i=2;i<=(n-1)*(n-1);i++){
            if(properDivisorSum(i) == n){
                return false;
            }
        } 
        return true;
    }


    public static void main(String[] args){
        Untouchable test = new Untouchable(8480);

        int elements = Integer.parseInt(args[0]);

        for(int i=1,count=0;count < elements;i++){
            if(test.untouchable(i)){
                System.out.printf("%4d: %4d%n",count,i);
                count++;
            }
        }
    }
}

1

Go,396个字节

并不是真的打高尔夫球,但是它可以完成所有要求的范围。运行约20分钟,需要约7GB(独立于n)。制作一个巨型数组以计算所有数字的除数之和,最大不超过59997平方。

func untouchable(n int) {
    const C = 59997
    const N = C * C
    s := make([]uint16, N)
    for d := 1; d < N; d++ {
        for i := 2 * d; i < N; i += d {
            v := int(s[i]) + d
            if v > C {
                v = C + 1 // saturate at C+1
            }
            s[i] = uint16(v)
        }
    }
    var m [C]bool
    for i := 2; i < N; i++ {
        if s[i] < C {
            m[s[i]] = true
        }
    }
    for i := 2; n > 0; i++ {
        if !m[i] {
            println(i)
            n--
        }
    }
}
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.