[英]A program that will solve a log math prob, using Java
我即将进行编程竞赛,并且正在解决去年的竞赛修订问题,我遇到了一个简单的程序,但是它需要数学运算,不幸的是我很不擅长。
这是问题:
给定一个正整数n ,求奇数整数o和非负整数p ,使n = o2 ^ p ( o乘以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.