我想在Perl中创建一个函数来计算要乘以的数组元素以获得给定值。
该数组包含559到574之间的整数。我想得到的值是3552907293224。
我该怎么做?
我们的想法是使用以下代码获取产生数字3552907293224的7个字符的字符串:
sub hash {
my $nr = 13;
for (split //, shift) {
$nr = $nr * 43 + index("acdegijmnoprstuw", $_);
}
return $nr;
}
我设法通过反复试验弄清楚字符串是" eddigjo",但我需要一个能够执行此操作的函数。
答案 0 :(得分:1)
很好。通过ThisSuitIsBlackNot算法:给定范围内的数字均不均匀地划分给定数字,因此不可能通过将它们相乘来获得它。
use warnings;
use strict;
my $num = 3552907293224;
my @range = (559..574);
my @divs = grep { $num % $_ == 0 } @range;
if (@divs) { print "Divisors: @divs\n"; }
else { print "No divisors found.\n"; }
# Check explicitly (lay our eyes on them)
for (@range) { print "res = " . ($num / $_) . "\n" }
我们可以进行这些输入,因此可以尝试不同的数字,但问题是针对这些问题的。一旦找到除数,那么你需要经历所有可能长度的所有排列,检查乘法结果。我们在谈论因子复杂性。对于小范围,它会起作用,并且有减少,但对于较小数字的较长范围,它会迅速爆炸。
以良好的性能运行它是一个有趣的数学和计算问题。
问题得到澄清,现在有点不同了:扭转了得到结果的过程。
结果是系列中的最后一个元素从13开始并由给定的算法生成。它由一个额外的输入字符串驱动,每个下一个字符的索引提供偏移量。我们需要扭转这一过程。
所以倒退。取结果并从中减去输入字符串的最后一个字符的索引(在给定的引用字符串中),然后除以43.这是我们的最后一个因素。现在从中减去输入字符串的前一个字符的索引并除以43,这是我们倒数第二个因素。重复,直到我们达到13。
$result = 3552907293224;
$refstr = 'acdegijmnoprstuw';
$str = 'eddigio';
for (split '', reverse $str) {
$result = $result - index($refstr, $_) ) / 43;
print "$result\n";
}
打印
82625751005 1921529093.02326 44686723.0005408 1039226.00001258 24168.0000002925 562.000000006802 13.0000000001582
这是一个过程,我们最终得到了13个事实证实了这一点。
问题进一步发展,现在是一个不同的post,答案很好。
答案 1 :(得分:-1)
从你的问题中我可以理解,你是在追求这样的事情...... 我的例子是用Java编写的,但我相信你明白了!
public String getMultiplicationElements(int[] values, int toGet)
{
//loop for first value in multiplication
//will only move to next element when multiplied by all values within array
for (int i = 0; i < values.length; i++)
{
//loop for second value in multiplication
for (int j = 0; j < values.length; j++)
{
//test if matches specified value
if ((values[i] * values[j]) == toGet)
{
//return indication of successful elements
return "Array indices " + i " and " + j
+ " multiply to get this result";
}
}
}
//for if no match found
return null;
}