Java 避免算术中的大整数类/大数字
我在一个字符串上执行一些mod算术类型的操作,其中每个字符都获得一个特定的初始值(取决于它的ascii)和在字符串中的位置。这些数字变得相当大,因为它们的初始值是Java 避免算术中的大整数类/大数字,java,Java,我在一个字符串上执行一些mod算术类型的操作,其中每个字符都获得一个特定的初始值(取决于它的ascii)和在字符串中的位置。这些数字变得相当大,因为它们的初始值是(ascii)*26^charPos。值得注意的是,数字字符只会将其值(0-9)添加到总数中 有没有办法避免使用BigInt类(因为我只对(initialval)%感兴趣(相对较小的数字))我想您可以使用通常的: value += val; if(value >= mod) value = value % mod; 但
(ascii)*26^charPos
。值得注意的是,数字字符只会将其值(0-9)添加到总数中
有没有办法避免使用BigInt类(因为我只对(initialval)%感兴趣(相对较小的数字))
我想您可以使用通常的:
value += val;
if(value >= mod)
value = value % mod;
但这只适用于已排序的整数列表,也无法解决单个字符使用上述字符值公式生成BigInt的问题。我相信mod操作员可以在适当的地方做些事情
作为旁白;
如果bigNum超过了long(或int,不管foo声明为什么)的大小,那么该算法将无法正常运行,对吗
我意识到我可以声明几个BigInteger对象,然后将所有值添加到一个totalValue,然后对total执行最后的mod操作,但是如果可能的话,我宁愿避免这种情况,因为BigInteger算法我并没有太多使用(在这种情况下,这似乎是一种痛苦,通常是不必要的)。我知道会有很多方法,但我不介意听到一些不同的观点。提前谢谢
下面是我想出的一些代码,只要长阈值没有被打破,这些代码就可以工作
public static void main(String[] args) {
String str = "st4ck0ver";
char[] x = str.toCharArray();
long value = 0;
int mod = 87;
for(int i = 0; i < x.length; i++) {
long val;
int charVal;
int exp = x.length - (i+1);
if((int)x[i] < 58) {
charVal = (int)x[i] - 48;
val = charVal;
}
else{
charVal = (int)x[i]- 96;
val = (long) (charVal * Math.pow(26, exp));
}
value += val;
System.out.println("exp:" + exp + ", char:" + x[i] + ", "
+ ", charValue:" + charVal + " value:" + val + ", curr total value:" + value);
}
value %= mod;
System.out.println("Final value:" + value);
}
如果结果是:
long longVal = new BigInteger(stringVal).mod(new BigInteger(modulus)).longValue();
太大,无法容纳长的引用JDK中的方法,您将遇到以下行为:
如果此BigInteger太大,无法放入长整数,则只返回低阶64位。请注意,此转换可能会丢失有关BigInteger值的总体大小的信息,并返回带相反符号的结果
因此,您的想法是正确的,如果您试图从大于long
的BigInteger
中获取long
值,您将无法获得准确的结果。如果您在某个模中执行此操作,则在字符串中迭代,跟踪该模中所需值的运行总数,适当的26次方的值,也在那个模数里。如您所述,如果模数非常小,则int
应足以满足这些要求
注意,我假设您的字符串在这里只包含小写字母。如果你需要的话,把它修好
int answer = 0;
int power = 1;
for (int i = 0; i < inputString.length(); i++) {
int charValue = inputString.charAt(i) - 'a';
answer += ( charValue * power );
answer %= mod;
power *= 26;
power %= mod;
}
你的问题很不清楚!!!!我同意你的问题不清楚。但是如果你想知道如何对一个太大的整数执行%
操作,我建议你坚持使用biginger
,除非smallMod
是2的幂。对于不定大整数的除法和%
是很难自己实现的,我很确定实现biginger
的人已经投入了大量的精力和研究来开发最好的算法来完成这项工作。感谢您的回复。当字符串中某个字符的初始值(出现在长字符串中)超过long时,就会出现问题。(我意识到我不需要数组,但我之前执行了与整数类似的操作,并且没有更改它。)char
的值如何超过long
的大小?我指的是特定字符根据其在字符串中的位置及其在字母表中的位置生成的值。值=(posInAlpha)(26^posInString)。我不能修改这个值公式,但你在问题中说,你把它全部加在一个特定的小值模中;在你的示例代码中,模数是87。除非模数接近int的大小,否则我的方法会很好地工作。如果所需模数中有26^posInString
的值,则26^posInString
的实际值是不相关的。我怀疑我的模数将超过200。但是我仍然不确定你的方法是如何运作的。。你的方法正是我想问的,但我不太明白如何携带模量。最后一句话“如果26^posInString的值在所需的模中,那么26^posInString的实际值是不相关的”非常好,但我不知道您的代码是如何实现这一点的。
int answer = 0;
int power = 1;
for (int i = 0; i < inputString.length(); i++) {
int charValue = inputString.charAt(i) - 'a';
answer += ( charValue * power );
answer %= mod;
power *= 26;
power %= mod;
}
int answer = 0;
int power = 1;
for (int i = inputString.length() - 1; i >=0; i--) {
if(inputString.charAt( i ) < 58) {
int charValue = inputString.charAt( i ) - 48;
answer += charValue;
}
else {
int charValue = inputString.charAt( i ) - 96;
answer += ( charValue * power );
}
answer %= mod;
power *= 26;
power %= mod;
}