【发布时间】:2015-03-25 06:12:23
【问题描述】:
我正在对字符串执行一些 mod 算术类型的操作,其中每个 char 都有一个特定的初始值(取决于它的 ascii)和字符串中的位置。这些数字变得非常大,因为它们的初始值为(ascii)*26^charPos。值得注意的是,数字字符只是将它们的值(0-9)加到总数中;
有没有办法避免使用 BigInt 类(因为我只对(intialVal)%(relatively small number)) 感兴趣,我想你可以使用通常的:
value += val;
if(value >= mod)
value = value % mod;
但这仅适用于整数的排序列表,也无法解决单个字符何时通过使用上述字符值公式生成 BigInt 的问题。我确信可以使用 mod 运算符完成一些事情。
顺便说一句; 如果 bigNum 超过 long(或 int,无论 foo 声明为)的大小,算法将无法正确计算,对吗?
int(or long) foo = BigNum(possibly bigger than long) % smallMod;
我意识到我可以声明几个 BigInteger 对象,然后将所有值添加到一个 totalValue 中,然后对总数执行最终的 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);
}
编辑:回应大卫华莱士的回答:
对不起,我重读了你的解释,我明白你在做什么......你的回答正是我的意思。我只是在处理字符是数字的情况下遇到了麻烦,因为它只添加数值而不是将其乘以26^pos。我保留了数值的运行总计,以便将其添加到最终答案中(如果超过 mod 值,则再次对其进行修改),但我不知道如何将适当的功率增加一好。我可能遗漏了一些非常明显的东西。注释代码是我解决这个问题的一半尝试:
public static void main(String[] args) {
//String str = "st4ck0ver";
//String str = "hello";
String str = "time2go";
char[] x = str.toCharArray();
int mod = 2004;
int answer = 0;
int power = 1;
int numericalVal = 0;
//int skipPower;
for (int i = x.length - 1; i >=0; i--) {
int charVal;
if((int)x[i] < 58) {
charVal = (int)x[i] - 48;
numericalVal += charVal;
//skipPower++; //perhaps need to use something like this?
//
} // down
else { // in here somewhere
charVal = (int)x[i]- 96;
answer += ( charVal * power);
answer %= mod;
power *= 26;
power %= mod;
//skipPower = 0; //reset skipPower in case it was used
}
}
//answer += numericalVal;
//if(answer + numericalVal >= mod)
// answer %= mod;
System.out.println("Final value:" + answer);
}
【问题讨论】:
-
你的问题很不清楚!!!
-
我同意您的问题不清楚。但是如果你想弄清楚如何对一个对于
long来说太大的整数执行%操作,我建议你坚持使用BigInteger,除非smallMod是2 的幂。和%不定大小的整数很难自己实现,我很确定实现BigInteger的人已经付出了很多努力和研究来开发最好的算法来完成这项工作。
标签: java