繁体   English   中英

使用Java解决对数数学问题的程序

[英]A program that will solve a log math prob, using Java

我即将进行编程竞赛,并且正在解决去年的竞赛修订问题,我遇到了一个简单的程序,但是它需要数学运算,不幸的是我很不擅长。

这是问题:

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

输入文件的第一行包含一个正整数d,正整数d等于测试用例的数量1 <= d <= 10 数据集如下。 每个数据集仅由一行组成,该行仅包含一个整数n,1 <= n <= 10 ^ 6

样品输出

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);
        }

    }

任何帮助表示赞赏。

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

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

我将它留给您翻译成Java。

许多不同的方式。 对于编程竞赛,当数字较少时,我通常采用一种简单的方法:蛮力! 也许不是您问题的完美答案,但在比赛中执行其他任务时请记住该问题:工作足够好,选择您可以想到的第一个解决方案并尝试实施。 至少对于我参加过的大多数比赛而言,这是正确的,这是关于在给定时间内执行尽可能多的任务。

对于公式n = o2 p ,其中o的奇数和p > 0,并且1 <= n <= 10 6 ,我们可以看到2 p始终至少为 2。这意味着o应该低于n的一半,因此我们只需要搜索o的最大值即可。 而且我们只需要检查奇数。

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

javacode:

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,TADA!

不同的蛮力方法可能是改为从p的值开始,或者改为将n除以2 p的不同值,直到获得奇数整数。

这个问题实际上并不需要太多的数学运算。 这是关于有点儿纠结。

有助于了解每个值2 ^ p等于(1<<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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM