我试图使用biginteger
值在C#中实现以下Java函数,以便不再适用64位限制。作为一项健全性检查,我将使用long
的原始函数也转换为C#代码。然而,问题是,使用long
的版本工作时,使用biginteger
的版本并不总是返回相同的结果。
C#中原始函数的实现。
public static long GetNextSubset(long subset)
{
long smallest = subset& -subset;
long ripple = subset + smallest;
long ones = subset ^ ripple;
ones = (ones >> 2) / smallest;
subset = ripple | ones;
return subset;
}
而不是像原始的Java代码那样打印所有的值,我打算使用它们,这样我就可以单独返回每个值。
public static IEnumerable<long> GetAllSubsets(int n, int k)
{
long max = 1L << n;
long subset = (1L << k) - 1L;
while ((max & subset) == 0)
{
yield return subset;
subset = GetNextSubset(subset);
}
}
public static BigInteger GetNextSubsetsBigInt(BigInteger subset)
{
var smallest = subset& -subset;
var ripple = subset + smallest;
var ones = subset ^ ripple;
ones = (ones >> 2) / smallest;
subset = ripple | ones;
return subset;
}
public static IEnumerable<BigInteger> GetAllSubsetsBigInt(int n, int k)
{
var max = new BigInteger(1 << n);
var subset = new BigInteger((1 << k) - 1);
while ((max & subset) == 0)
{
yield return subset;
subset = GetNextSubsetsBigInt(subset);
}
}
在组合学中,使用choose函数可以很容易地验证生成的数字集合是否具有正确的值数:
选择(n,k)=n!/(k!*(n-k)!)
从52张扑克牌的标准副牌中抽取两张牌的方法数是1326,但biginteger
实现只产生190张。
如何更正biginteger
实现?
问题是,在创建bigInteger
之前,要对int
进行位移位。只需更改它,创建一个biginteger
值1,然后进行位移位。甚至还有一个静态属性可以使用,称为BigInteger.One
。
public static IEnumerable<BigInteger> GetAllSubsetsBigInt(int n, int k)
{
var max = BigInteger.One << n;
var subset = (BigInteger.One << k) - 1;
while ((max & subset) == 0)
{
yield return subset;
subset = GetNextSubsetsBigInt(subset);
}
}
问题内容: 如何与大整数一起使用?喜欢 Eclipse表示未为BigInteger定义运算符%。 有任何想法吗? 问题答案: 像这样: 或者,正如用户Duncan在评论中建议的那样,我们可以像这样完全删除if语句:
我正在尝试在旁边使用值方法。 不幸的是,编译器说不兼容的类型。 如果我将s更改为s,它仍然不喜欢它。
在 C 语言中,相同的数字可以用不同的数制来表示。也就是十进制的数字可以等价的表示为二进制或者十六进制。那么对于二进制来说,可以进行逐个数字之间,也就是每一个数字位的运算。这种运算也广泛的存在我们日程使用的数字电路中。其实计算机的运算原理最底层就是位运算,也就是 0 和 1 的运算。 1. 位运算符 运算符 作用 示例 & 位与 a&b | 位或 a|b ^ 位异或 a^b ~ 位非 ~b <<
问题内容: 我想知道是否存在一种将变量相乘的方法,因为运算符无法应用于。 所以我想知道是否可以在不使用运算符的情况下将两个相乘。 问题答案: 您可以这样使用s 方法: 我早就应该指出这是一成不变的。因此,任何运算结果都必须存储到变量中。运算符或操作数永远不会更改。
主要内容:按位与运算(&),按位或运算(|),按位异或运算(^),取反运算(~),左移运算(<<),右移运算(>>)所谓 位运算,就是对一个比特(Bit)位进行操作。在《 数据在内存中的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。 C语言提供了六种位运算符: 运算符 & | ^ ~ << >> 说明 按位与 按位或 按位异或 取反 左移 右移 按位与运算(&) 一个比特(Bit)位只有 0 和 1 两个取值,只有参与 运算的