- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在对字符串执行一些 mod 算术类型的操作,其中每个字符都会获得特定的初始值(取决于其 ascii)和字符串中的位置。这些数字变得非常大,因为它们的初始值为 (ascii)*26^charPos
。值得注意的是,数字字符仅将其值(0-9)添加到总数中;
有没有办法避免使用 BigInt 类(因为我只对 (intialVal)%(相对较小的数字)感兴趣)
我想你可以使用通常的:
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 值,则再次对其进行修改),但我也不知道如何将适当的功率增加 1。我可能遗漏了一些非常明显的东西。注释的代码是我解决这个问题的一半尝试:
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);
}
最佳答案
如果您在某个模数中执行此操作,则迭代您的字符串
,跟踪该模数中所需值的运行总计,以及同样在该模数中的 26 的相应幂的值。如果模数非常小,正如您所说,那么 int
应该足以满足其中每一个。
请注意,我假设您的String
此处仅包含小写字母。如果需要,请修复此问题。
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;
}
编辑
适应OP的编辑,它表明String
必须以相反的顺序遍历,并且在遇到数字时不考虑位置值,代码可能应如下所示。
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;
}
关于java - 在算术中避免 BigInteger 类/大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29248641/
我正在尝试计算一个大数,这需要 BigInteger.Pow(),但我需要指数也是 BigInteger 而不是 整数。 即 BigInteger.Pow(BigInteger) 我怎样才能做到这一点
在 Java 中,大多数基本类型都是有符号的(一位用于表示 +/-),因此当我超出类型的限制时,我会得到意想不到的结果,比如负数。 有没有比使用 BigInteger 更好的解决方案,因为 BigIn
如何选择随机元素 α ∈ Z*p? P 是一个随机的 1024 位素数 BigInteger。 这是我找到 BigInteger p 的方法: Random rand = new Random(new
我正在尝试使用 BigInteger 类在 Java 中实现 Fermat、Miller-Rabin 或 AKS 算法。 我想我有Fermat test已实现,但 BigInteger 类不允许将 B
我知道 BigInteger 有一个构造函数,您可以在其中通过传递新 BigInteger 的最大 bitLength 和一个随机参数来生成随机 BigInteger: BigInteger(int
我正在考虑为自己存储公钥的想法。为此,我需要将 BigInteger 转换为某种变量,然后从该值重新创建 BigInteger。 我在 Stackoverflow 中进行了搜索,找到了执行此操作的最佳
目前我正在使用 Long 整数类型。我使用以下方法从/到二进制/数字进行转换: Convert.ToInt64(BinaryString, 2); //Convert binary string of
我有以下代码: public static BigInteger[] Cubes (int m){ Set result = new HashSet(); for (int i = 1
因此,在我的计算机科学课上,我们一直在学习如何使用 Java 编码,并且我遇到了编码本身的第一个局限性。问题是 long 只允许您存储最多 64 位或接近该位的数字。所以我们已经开始用 16 位数字进
你好我想计算 2^(256bit number) 在 java 中,但 biginteger 的 pow 函数只能处理 int。 如何计算更大的数字? 有图书馆吗? 我想计算来自的所有数字 2^0 2
我正在尝试构建一个 BigInteger 数组,但似乎该数组需要由整数本身索引(如果是这样,那对我来说似乎非常愚蠢,但我希望我只是误解了一些东西) .我正在尝试的基本上是以下内容: BigIntege
我在 .Net 项目中使用 BigInteger ( link ) 的单声道实现在 Java 中我使用 java.math.BigInteger。 相同的代码在 Java 中产生不同的结果。 .Net
我正在构建 DSA 算法。但是在将 BigInteger 数字与其他 BigInteger 数字进行排名时遇到了问题。这是我要使用的公式: v = ((g^u1 * y^u2) mod p) mod
我正在尝试用Java实现Schnorr签名算法。我遇到了计算大指数幂(例如 MD5 哈希值)的问题。 有什么方法可以让BigInteger获得BigInteger的权力吗? 我需要计算 (a^x*b^
我正在编写斐波那契程序。 public class ImperativeFibonacci implements Fibonacci { public BigInteger fibonacci(i
我原以为 BigInteger 类中的两个构造函数 BigInteger(String) 和 BigInteger(byte[]) 的行为相似,但事实并非如此。 为什么两个 BigInteger 不相
在 Java 中,要将 String 转换为 BigInteger,您可以使用构造函数 new BigInteger(String),但要将 int/long 转换为工厂函数,您可以使用 BigInt
我正在做一些大整数计算,我需要对一个 BigInteger 求另一个 BigInteger 的幂。 .pow() 方法执行我想要的操作,但将 int 值作为参数。 .modPow 方法采用 BigIn
Java 7 方法的复杂性是什么pow和 isProbablePrime在BigInteger类(class)? 我知道 Rabin 测试的简单实现具有 O(k(log(n))^3) 复杂度,可以通过
.NET 4.0 为任意大的整数提供了 System.Numerics.BigInteger 类型。我需要计算 BigInteger 的平方根(或合理的近似值——例如整数平方根)。这样我就不必重新实现
我是一名优秀的程序员,十分优秀!