【问题标题】:Program isn't terminating for a specific input程序不会因特定输入而终止
【发布时间】:2022-11-25 21:15:22
【问题描述】:

我正在尝试编写一个程序,让我知道一个数的奇数是否大于一。设 n 为数字,x 为除数。 x%2!=0 且 x>1; 代码:

import java.util.Scanner;
public class Simple1{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        long n;
        for(int i=0; i<t; i++) {
            n=sc.nextLong();
            if(n<3)System.out.println("NO");
            else {
                
                if(n%2!=0)System.out.println("YES");
                else {
                    int ans=0;
                    for(long j=3; j<=n/2; j+=2) {
                        if(n%j==0) {
                            ans=1;
                            break;
                        }
                    }
                    if(ans==1)System.out.println("YES");
                    else System.out.println("NO");
                }
                
            }
        }
    }
}

这个java代码工作正常。但它不适用于特定输入.. 那就是 n = 1099511627776。如果我将最后一位数字更改为 6 以外的任何整数,那么它可以正常工作并提供输出。甚至比这更大的数字也有效。但是只有这个数字 n=1099511627776,当我将它输入到我的程序中时,没有终止发生也没有输出。帮我弄清楚这里发生了什么。

【问题讨论】:

  • 数字1099511627776 是 2 的 40 次方。这意味着它必须检查整个大 for 循环以找到没有奇怪的因素。如果你想这样做,你必须等待更长的时间。
  • 您可以在循环中添加一些输出以查看它正在检查的内容。您会发现它只需要很长时间,因为您要求它检查大量的模运算。
  • 为了使其(更快)更快,您可以将 n 除以 2,直到得到奇数。

标签: java


【解决方案1】:

数字1099511627776 是 2 的 40 次方。这意味着它必须检查整个大 for 循环以找到没有奇怪的因素。 2199023255552(2 到 41)和 549755813888(2 到 39)会在不同程度上遇到相同的问题。如果你想这样做,你必须等待更长的时间。

一种更快的方法是将 n 除以 2,直到得到奇数。

例如。

long n = sc.nextLong();
while (n > 1 && n % 2 == 0) {
   n /= 2;
}
if (n > 1) {
    System.out.println("Yes.");
} else {
    System.out.println("No.");
}

【讨论】:

    【解决方案2】:

    你能用另一种方式摆脱二的力量吗?

    long number = 1099511627776l;
    long r = number >> Long.numberOfTrailingZeros​(number);
    

    如果 r 大于 1,则 r 是奇数除数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2015-11-10
      相关资源
      最近更新 更多