【问题标题】:Checking if an integer is a circular prime number without using String在不使用字符串的情况下检查整数是否是循环素数
【发布时间】:2016-11-05 00:02:12
【问题描述】:

我必须编写一个布尔方法来检查一个数字 n 是否是一个循环素数,只使用整数计算,所以没有字符串。我写了另外两个必须包含的方法。

boolean isPrime(int n) {
    if (n < 1) {
        return false;
    } else if (n == 1 || n == 2) {
        return true;
    } else if (n % 2 != 0) {
        for (int i = 3; i < n; i+=2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    } else {
        return false;
    } 
}

这会检查数字是否为素数。

int largestPowerOfTen(int n) {
    for (int i = 1; i < n * 10; i*=10) {
        if (n / i == 0) {
            return i / 10;
        }
    }
    return 1;
}

这将返回数字的 10 的最大幂。例如,23 将返回 10,704 将返回 100,等等。

我的想法是将每个数字放入一个数组并从那里移动数字,但我被困在移动部分。

boolean isCircularPrime(int n) {
    ArrayList<Integer> k = new ArrayList<Integer>();
    int i = 0;

    while (n != 0) {
        k.add(n % 10);
        n /= 10;
        i++;
    }
    //???
}

那么我该如何移动数字呢?

【问题讨论】:

  • 您不需要 ArrayList 或字符串:将最后一位数字计算为 n 模 10。将 n 除以 10 并向下取整。将largestPowerOfTen(n) 的最后一位数字乘以n。您现在应该已经将n 向右旋转了一个位置。

标签: java int primes


【解决方案1】:

假设“循环素数”是一个数字,它是所有数字旋转的素数......

您不能只旋转数字,因为不会保留零。

首先将数字分解为一个数组 - 数字的每个数字都是数组的一个元素。使用n % 10 查找最后一位数字,然后使用n /= 10 直到n == 0

创建一个从具有指定起始索引的数组中生成数字的方法。这是问题的症结所在,下面是一些代码:

private static int generate(int[] digits, int index) {
    int result = 0;
    for (int i = 0; i < digits.length; i++) {
        result = result * 10 + digits[(index + i) % digits.length];
    }
    return result;
}

然后遍历每个可能的数字起始索引并检查它是否是素数。

剩下的代码我留给读者...

【讨论】:

    【解决方案2】:
    import java.util.Scanner;
    class CircularPrime
    {
        public boolean prime(int n)
        {
            int lim=n,count=0;
            for(int i=1;i<=lim;i++)
            {
                if(n%i==0)count++;
            }
            if(count==2)
            return true;
            else
            return false;
        }
        public int circlize(int n)
        {
            int len,x,y,circle;
            len=(""+n).length();
            x=n/(int)Math.pow(10,len-1);
            y=n%(int)Math.pow(10,len-1);
            circle=(y*10)+x;
            return circle;
            /**
            Another way using String
            String str = Integer.toString(n);
            String arr = str.substring(1)+str.charAt(0);
            int a = Integer.parseInt(arr);
            return a;
            **/
        }
        public void check(int n)
        {
            int a=n;
            boolean flag=true;
            System.out.println("OUTPUT:");
            do
            {
                if(!(prime(a)))
                {
                    flag=false;
                    break;
                }
                a=circlize(a);
                System.out.println(a);
            }while(a!=n);
            if(flag)System.out.println(n+" IS A CIRCULAR PRIME");
            else System.out.println(n+" IS NOT A CIRCULAR PRIME");
        }
        public static void main(String ar[])
        {
            CircularPrime obj = new CircularPrime();
            Scanner  sc = new Scanner(System.in);
            System.out.print("Enter a number: ");
            int n=sc.nextInt();
            obj.check(n);
        }
    }
    

    【讨论】:

    • 感谢@TT 我是堆栈溢出的新手,所以我不知道如何正确缩进。
    • 不客气。您可以查看this link,了解有关 Stack Overflow 格式的一些说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2017-03-19
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多