我正在努力使用以下代码(/ challenge),我想知道解决它的最佳方法是什么。
如果我正确理解了代码,那么:
var val = 1
foreach (char in firstargument):
val = val * ((ascii)char + 27137)
if (val == 92156295871308407838808214521283596197005567493826981266515267734732800)
print "correct"
else
print "incorrect"
'firstargument'是传递给程序的参数,如:./ program 123456 ...
#define _GNU_SOURCE
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <gmp.h>
int main(int argc, char *argv[])
{
mpz_t val, mul, cmpval;
char str[513];
int n = 0;
mpz_init(val);
mpz_set_ui(val, 1);
mpz_init(mul);
mpz_init(cmpval);
mpz_set_str(cmpval, "92156295871308407838808214521283596197005567493826981266515267734732800", 10);
if (argc < 2)
{
printf("%s <string>\n", argv[0]);
return -1;
}
strncpy(str, argv[1], 512);
for (n = 0; n < strlen(str); n++)
{
mpz_set_ui(mul, (unsigned long)(str[n] + 27137));
mpz_mul(val, val, mul);
}
if (!(n = mpz_cmp(val, cmpval)))
{
printf("correct.\n");
}
else
{
printf("incorrect.\n");
}
return 0;
}
答案 0 :(得分:2)
我会从这个观点来看待大数字必须可以被((ascii)theVeryLastChar + 27137)
整除 - 并试图找出最后一个字符是什么 - 然后除以它并将其用于'最后一个char'等的第二个
答案 1 :(得分:2)
这是一个用于计算解决方案的Prolog程序,首先使用较低ASCII码的字母。
solve(A) :-
number_anagram(92156295871308407838808214521283596197005567493826981266515267734732800, L),
atom_codes(A,L).
number_anagram(N, L) :-
number_anagram(N, 32, L).
number_anagram(1, 126, []).
number_anagram(N, C, [C|R]) :-
N > 1,
F is C + 27137,
N mod F =:= 0,
N1 is N / F,
number_anagram(N1, C, R).
number_anagram(N, C, L) :-
C < 126,
C1 is C + 1,
number_anagram(N, C1, L).
事实证明只有一个解决方案:
$ swipl
[...]
?- ['number-anagram.pl'].
% number-anagram.pl compiled 0.00 sec, 1,636 bytes
true.
?- solve(A).
A = abbefhiooooorrsy ;
false.
答案 2 :(得分:1)
我认为这也被称为中国剩余定理/问题。 diogenes算法是解决方案。