//回文数猜想
/**
任何一个自然数与它的倒序数相加,所得的和再与和的倒序数相加,……如此反复进行下去,
经过有限次步骤后,最后必定能得到一个回文数。
这也仅仅是个猜想,因为有些“桀骜的”数并不被“驯服”。比如说196和277386,按照上述变
换规则重复了数十万次,仍未得到回文数。但是人们既不能肯定运算下去永远得不到回文数,
也不知道需要再运算多少步才能最终得到回文数。
**/
import console;
import math.bignum;
//判断整数x是否为回文数,若是返回运算次数,回文数的值;若不是则返回“x没有回文数“
isPalindromes=function(x){
var con=0;
var m=math.bignum(x);
if m.eq(numReverse_order(m)) return 0,m.tostring(10); //假如本身是回文数返回
while(!m.eq(numReverse_order(m))){
con++;
var n=math.bignum(numReverse_order(m))
m=m.add(n);
console.logPause(con,m.tostring(10))
}
if(m.eq(numReverse_order(m))){
return con,m.tostring(10);
}
else {
return tostring(x)++"没有回文数";
}
}
//求整数x的反序函数
numReverse_order=function(x){
var temp=math.bignum(x);
return string.reverse(temp.tostring(10));;
}
var m=math.bignum("123456789987654321")
console.log(isPalindromes(m))
console.pause()
测试时arrdio的大数库函数要扩充一下,因为引入的tiny-bignum-c.dll库并未得到充分利用,因此在aardio的大数库中增加了大数值相等比较eq()函数和值转换的tonumber(基数)函数.代码如下:
eq = function(n){
return 0 == _dll.bignum_cmp( owner,..math.bignum(n));
};
tostring = function(radix){
if(radix=16) return owner;
var size = (_arraySize: 32)*8;
if(radix && radix!=16){
var ptr = ..raw.realloc(size+2)
_dll.bignum_to_string(owner.bigNumber,ptr,size);
var out = ..raw.buffer(1024);
var size = _dll.bigNumConvert(ptr,out,16,radix);
var s = ..raw.tostring(out,1,size);
..raw.realloc(0,ptr);
return s;
}
}
当然也可以直接调用元方法,方法是tab@._eq,tab@._tostring(基数).