如果数字 K 是两个不同数字(A,B)的乘积,请找出最大数字(< = A&< = B)划分 K 。
例如:K = 54(6 * 9)。这两个数字都是可用的,即6和9。
我的方法相当简单或微不足道。
对于给定的例子,3 * 3 = 9除以K,因此3是答案。
寻找更好的算法,而不是简单的解决方案。
注意:测试用例在1000年左右,因此需要采用最佳方法。
答案 0 :(得分:1)
我相信其他人会想出一个涉及模数运算的好答案。这是一种天真的方法......
每个因素本身都可以被考虑(尽管这可能是一项昂贵的操作)。
考虑到这些因素,您可以查找重复因子组。
例如,使用您的示例:
9:3的主要因素
素数因子为6:2,3
所有主要因素:2,3,3,3
有两个3,所以你有答案(3分的平方54)。
36 x 9 = 324
的第二个例子理论因子为36:2,2,3,3
9:3的主要因素
所有主要因素:2,2,3,3,3,3
所以你有两个2和4个3,这意味着重复2x3x3。 2x3x3 = 18,因此18的平方除以324.
编辑:python原型
import math
def factors(num, dict):
""" This finds the factors of a number recursively.
It is not the most efficient algorithm, and I
have not tested it a lot. You should probably
use another one. dict is a dictionary which looks
like {factor: occurrences, factor: occurrences, ...}
It must contain at least {2: 0} but need not have
any other pre-populated elements. Factors will be added
to this dictionary as they are found.
"""
while (num % 2 == 0):
num /= 2
dict[2] += 1
i = 3
found = False
while (not found and (i <= int(math.sqrt(num)))):
if (num % i == 0):
found = True
factors(i, dict)
factors(num / i, dict)
else:
i += 2
if (not found):
if (num in dict.keys()):
dict[num] += 1
else:
dict[num] = 1
return 0
#MAIN ROUTINE IS HERE
n1 = 37 # first number (6 in your example)
n2 = 41 # second number (9 in your example)
dict = {2: 0} # initialise factors (start with "no factors of 2")
factors(n1, dict) # find the factors of f1 and add them to the list
factors(n2, dict) # find the factors of f2 and add them to the list
sqfac = 1
# now find all factors repeated twice and multiply them together
for k in dict.keys():
dict[k] /= 2
sqfac *= k ** dict[k]
# here is the result
print(sqfac)
答案 1 :(得分:0)
C ++答案
int func(int i, j)
{
int k = 54
float result = pow(i, 2)/k
if (static_cast<int>(result)) == result)
{
if(i < j)
{
func(j, i);
}
else
{
cout << "Number is correct: " << i << endl;
}
}
else
{
cout << "Number is wrong" << endl;
func(j, i)
}
}
说明:
第一次递归然后测试结果是否为正整数,如果是,那么如果更大的递归函数尝试另一个倍数则检查另一个倍数是否更小或更大,如果不是则那么它是正确的。然后,如果结果不是正整数,那么print Number是错误的并且执行另一个递归函数来测试j。
答案 2 :(得分:0)
如果我正确地解决了问题,我发现你有一个长度= A,宽度= B,面积= K的矩形 并且您希望将其转换为正方形并失去最小可能区域
如果是这种情况。因此,算法的问题不是迭代迭代迭代直到获得输出的成本。 相反,问题是您的算法在很大程度上取决于输入矩形的长度A和宽度B. 虽然它应该只取决于区域K
例如:
所以,在我的解决方案中,我假设一个输入K
我的想法如下
这可能需要额外的迭代,但可以保证准确的答案 此外,对sqrt(K)的成本可能存在一些顾虑 但它只会调用一次,以避免误导长度和宽度输入