我希望这能找到你。
我正在尝试使用ASCII代码转换单词的索引(数字)。 例如:
index 0 -> " "
index 94 -> "~"
index 625798 -> "e@A"
index 899380 -> "!$^."
...
我们都可以看到,第四个索引对应一个4字符串。不幸的是,在某些时候,这些组合变得非常大(即,对于8个字符的单词,我需要执行16位数字的操作(例如:6634204312890625),如果我提高字符的数量,它会变得非常糟糕字)。
为了支持这么大的数字,我不得不将我的程序的一些变量从unsigned int升级到unsigned long long,但后来我意识到来自C ++的modf()使用了double和uint32_t(http://www.raspberryginger.com) /jbailey/minix/html/modf_8c-source.html)。
问题是:这是否可以使modf()使用64位数字,如unsigned long long?我担心如果不可能,我将被限制为双倍长度的数字。
有人可以请我吗? =)
答案 0 :(得分:1)
16位数字符合64位数字的范围,因此您应该使用uint64_t
(来自<stdint.h>
)。然后%
运算符应该执行您需要的操作。
如果你需要更大的数字,那么你需要使用一个大整数库。但是,如果你感兴趣的只是模数,那么你可以根据以下properties of modulus提取技巧:
mod(a * b) == mod(mod(a) * mod(b))
mod(a + b) == mod(mod(a) + mod(b))
例如,我们将16位十进制数字x
表示为:
x = x_hi * 1e8 + x_lo; // this is pseudocode, not real C
其中x_hi
是8个最重要的十进制数字,x_lo
是最不重要的数字。然后x
的模数可以表示为:
mod(x) = mod((mod(x_hi) * mod(1e8) + mod(x_lo));
其中mod(1e8)
是一个可以预先计算的常数。
所有这些都可以用整数运算来完成。
答案 1 :(得分:0)
我实际上可以使用之后删除的评论(奇怪为什么),说:
modulus = a - a/b * b;
我在分区中投了一个无符号长长的投手。
现在......我有点失望,因为在我的问题中我认为我可以继续提高单词的字符数没有问题。尽管如此,我已经开始在chars = 7的范围内获得尺寸问题了。为什么? 95 ^ 7开始给出巨大的数字。
我希望有可能写一个像“我的猫很胖我1234r5s”这样的词并计算出它的索引,但这个词有近30个字符:
95^26 = 2635200944657423647039506726457895338535308837890625
组合。
无论如何,谢谢你的回答。