【问题标题】:A program that will solve a log math prob, using Java使用 Java 解决对数数学问题的程序
【发布时间】:2014-04-03 18:52:11
【问题描述】:

我有一个编程比赛即将举行,我正在解决去年的问题作为比赛的修订,我遇到了一个简单的程序,但是它需要数学,不幸的是我很不擅长。

问题来了:

给定一个正整数n,求奇数o和 非负整数 p 使得 n=o2^p (o 乘以 2 权力p

输入文件的第一行正好包含一个正整数 d 等于测试用例的数量,1。数据集如下。每个数据集仅包含一行 正好是一个整数n, 1

样本输出

2 //d 测试用例个数的值
24 // n 的值
27 // n 的值

样本输出
3 3 // 第一个 3 是 o 的值,第二个 3 是 p 的值
7 7 // 第一个 7 是 o 的值,第二个 7 是 p 的值

“//”部分不应在输出或输入中

这就是我到目前为止所做的,除了我需要用于正确求解方程的公式之外,我做的一切都是正确的

public static void main(String[] args) {

    double n = 0, d = 0, o = 0, p = 0;

    double x = 1;

    //START INPUT
    Scanner input = new Scanner(System.in);
    //input d, number of times program repeats

    System.out.println("Please enter the number of times you want to run the test(no more than 10)");
    d = input.nextDouble();

    //check the validity of d
    while((d > 10) || (d<1)){
        System.out.println("Invalid input");
         System.out.println("Enter another value for d");
         d = input.nextDouble();
    }



    while(x <= d){

            x++;

            System.out.println("enter a value for n");
            n = input.nextDouble();
    //check the validity of n
        while((n > 1000000) || (n<1)){
            System.out.println("Invalid input.");
            System.out.println("Enter Another Value for n");
            n = input.nextDouble();
        }
        //Calculates
        p = Math.log(n) / Math.log(2.0);
        o = n / Math.pow(p, 2);
    //STOP CALCULATE

    //PRINTS    
        System.out.println(o + " " + p);
        }

    }

感谢任何帮助。

【问题讨论】:

  • Math.pow()
  • 27 的结果实际上不会是 (7,7)。作为另一个示例,您可以添加 28 和 (7,2)。

标签: java function math


【解决方案1】:

你需要做的就是反复除以2:

function removeTwo(n)
    o, p := n, 0
    while o % 2 == 0
        o, p := o/2, p+1
    return o, p

我会留给你翻译成 Java。

【讨论】:

    【解决方案2】:

    许多不同的方式。对于编程竞赛,我通常会在人数较少时采用一种简单的方法:蛮力!也许不是你问题的完美答案,但在比赛中做其他任务时请记住:工作已经足够好,选择你能想出的第一个解决方案并尝试实施它。至少对于我参加过的大多数比赛来说都是如此,这是关于在给定的时间范围内完成尽可能多的任务。

    对于公式n = o2po 奇数和 p > 0,以及 1 n 6, 我们可以看到 2p 总是至少 2。 这意味着 o 应该低于 n 的一半,因此我们只需要搜索 o 最多为我们给出的值的一半。我们只需要检查奇数。

    然后可以为所选的 o 尝试不同的 p 值。如果结果大于n,我们应该尝试下一个o的值。

    java代码:

    public void calc(int n) {
        for (int o = 1; o <= n / 2; o += 2) {
            int p = 1;
            while (true) {
                int test = o * (int) Math.pow(2, p);
                if (test == n) { // solution found
                    System.out.println("o:" + o + ", p:" + p);
                    return;
                }
                if (test > n) break; // total value too high, lets start with another o
                p++;
            }
        }
    }
    

    输入 n=24 逐步完成:
    o = 1, p = 1 => 2
    o = 1, p = 2 => 4
    o = 1, p = 3 => 8
    o = 1, p = 4 => 16
    o = 1, p = 5 => 32, 太高了,再试试 o
    o = 3,p = 1 => 6
    o = 3, p = 2 => 12
    o = 3,p = 3 => 24,多田!

    不同的暴力破解方法可能是从 p 的值开始,或者将 n 除以 2 的不同值p,直到得到一个奇数。

    【讨论】:

    • 我尝试了代码,但 Eclipse 要求我输入一个“;”在 pow(2, p) 之后,但在“返回”之后出现错误,上面写着“无法访问的代码”
    • @user3495129 这只是伪代码,您需要对其进行一些更改才能使其在 java 中工作。不过,代码的想法应该很清楚。
    • 我尝试了代码并让它工作,当我输入数字 24、48、52 时,程序工作,但是当我尝试像 50 这样的数字时,我得到 o = 23 和 p =2 ,这是错误的,我尝试从“o
    • @user3495129 更新了我的代码。它应该是
    【解决方案3】:

    这个问题实际上并不涉及太多数学。而是有点玩弄。

    知道每个值 2^p 等于 (1&lt;&lt;p) 会有所帮助。知道了这一点,您可以首先计算在n 中设置的最高位。例如

    n = 24 =  11000 (binary) : Highest bit is 4
    n = 36 : 100100 (binary) : Highest bit is 5
    

    然后你可以从这个位位置开始作为p 的候选,减小这个值直到你发现方程是可解的。当您达到零时,输入值n 一定是奇数。如果需要,可以在开始时明确检测到这一点。

    import java.util.Arrays;
    
    public class FindFactors
    {
        public static void main(String[] args)
        {
            for (int n=0; n<100; n++)
            {
                System.out.println("For "+n+" : "+Arrays.toString(findFactors(n)));
            }
        }
    
        private static int[] findFactors(int n)
        {
            int p = highestBit(n);
            while (p >= 0)
            {
                int twoPowP = (1 << p);
                int c = n / twoPowP;
                if (c * twoPowP == n)
                {
                    return new int[]{c,p};
                }
                p--;
            }
            return null;
        }
    
        private static int highestBit(int n)
        {
            int b = 0;
            while (n > 1)
            {
                n >>= 1;
                b++;
            }
            return b;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多