有人可以解释一下这个算法会发生什么来检查它是否是泛数字的吗?
Can somebody explains what happens in this algorithm to check if its a pandigital?
我知道 << 操作数将操作数的左侧值与右侧的值一起移动位。所以 1 << 2 会得到 4。如果操作数存在于任一值中,则操作数复制一点。但是我根本无法理解代码。
private static bool isPandigital(long n)
{
int digits = 0;
int count = 0;
int tmp;
while (n > 0)
{
tmp = digits;
digits = digits | 1 << (int)((n % 10) - 1);
if (tmp == digits)
{
return false;
}
count++;
n /= 10;
}
return digits == (1 << count) - 1;
}
为什么第 8 行说 1 <<?为什么是模块 - 1?
最重要的是,当返回值时,我不知道最后一行发生了什么。帮助将不胜感激。非常感谢!
正在做
digits = digits | 1 << (int)((n % 10) - 1);
与
相同
long temp1 = n % 10; //Divide the number by 10 and get the remainder
long temp2 = temp1 - 1; //Subtract 1 from the remainder.
int temp3 = (int)temp2; //cast the subtracted value to int
int temp4 = 1 << temp3; //left shift 1 to the casted value. This is the same as saying "two to the power of the value of temp3"
int temp5 = digits | temp4; //bitwise or together the values of digits and that leftshifted number.
digits = temp5; //Assign the or'ed value back to digits.
最后一行
return digits == (1 << count) - 1;
只是在做与
相同的事情
int temp1 = 1 << count; //left shift 1 `count` times, this is the same as saying "two to the power of the value of count"
int temp2 = temp1 - 1; //Subtract 1 from the leftshifted number.
bool temp3 = digits == temp2; //test to see if digits equals temp2
return temp3;
我不知道"pandigital"是什么意思,但是这个break apart可以帮助你理解发生了什么。
如果pandigital表示"contains all possible digits for the given radix"
https://en.wikipedia.org/wiki/Pandigital_number
和 radix == 10
,为什么不检查数字是否包含所有可能的 0..9
数字:
private static bool isPandigital(long n) {
// I assume negative numbers cannot be pandigital;
// if they can, put n = Math.Abs(n);
if (n < 1023456789) // smallest pandigital
return false;
int[] digits = new int[10];
for (; n > 0; n /= 10)
digits[n % 10] += 1;
return digits.All(item => item > 0);
}
编辑:如果是位数组([=14=中的每个位 ]代表一个数字)实现:
private static bool isPandigital(long n) {
// negative numbers can't be pandigital
if (n < 1023456789) // smallest pandigital
return false;
int digits = 0;
for (; n > 0; n /= 10)
digits |= (1 << (int)(n % 10));
// 0b1111111111
return digits == 1023;
}
我认为该方法的作者试图这样做:
static bool IsPandigital(long n) {
int digits = 0;
while (n > 0) {
//set the bit corresponding to the last digit of n to 1 (true)
digits |= 1 << (int)(n % 10);
//remove the last digit of n
n /= 10;
}
//digits must be equal to 1111111111 (in binary)
return digits == (1 << 10) - 1;
}
<<
运算符并不难。你只需要用二进制来思考。
1 << 0 只是一个 1 移位的零位,所以 1
1 << 1 是 10
1 << 2 是 100,等等
如果你遇到一个 2 和一个 5 并且你 'or' 他们在一起你将有 100100.
这意味着如果您遇到所有 10 个数字,最终结果将是十个 1。
在 return 语句中,我们检查数字是否等于十个 1。
1 << 10 表示 10000000000。如果减去 1,则得到 1111111111
当然,所有这些都是二进制的。
他可能对 pandigital 有不同的定义,或者只是不同的要求。例如,如果不允许使用零,您只需将最后一行更改为:digits == (1 << 10) - 2;
我知道 << 操作数将操作数的左侧值与右侧的值一起移动位。所以 1 << 2 会得到 4。如果操作数存在于任一值中,则操作数复制一点。但是我根本无法理解代码。
private static bool isPandigital(long n)
{
int digits = 0;
int count = 0;
int tmp;
while (n > 0)
{
tmp = digits;
digits = digits | 1 << (int)((n % 10) - 1);
if (tmp == digits)
{
return false;
}
count++;
n /= 10;
}
return digits == (1 << count) - 1;
}
为什么第 8 行说 1 <<?为什么是模块 - 1? 最重要的是,当返回值时,我不知道最后一行发生了什么。帮助将不胜感激。非常感谢!
正在做
digits = digits | 1 << (int)((n % 10) - 1);
与
相同long temp1 = n % 10; //Divide the number by 10 and get the remainder
long temp2 = temp1 - 1; //Subtract 1 from the remainder.
int temp3 = (int)temp2; //cast the subtracted value to int
int temp4 = 1 << temp3; //left shift 1 to the casted value. This is the same as saying "two to the power of the value of temp3"
int temp5 = digits | temp4; //bitwise or together the values of digits and that leftshifted number.
digits = temp5; //Assign the or'ed value back to digits.
最后一行
return digits == (1 << count) - 1;
只是在做与
相同的事情int temp1 = 1 << count; //left shift 1 `count` times, this is the same as saying "two to the power of the value of count"
int temp2 = temp1 - 1; //Subtract 1 from the leftshifted number.
bool temp3 = digits == temp2; //test to see if digits equals temp2
return temp3;
我不知道"pandigital"是什么意思,但是这个break apart可以帮助你理解发生了什么。
如果pandigital表示"contains all possible digits for the given radix"
https://en.wikipedia.org/wiki/Pandigital_number
和 radix == 10
,为什么不检查数字是否包含所有可能的 0..9
数字:
private static bool isPandigital(long n) {
// I assume negative numbers cannot be pandigital;
// if they can, put n = Math.Abs(n);
if (n < 1023456789) // smallest pandigital
return false;
int[] digits = new int[10];
for (; n > 0; n /= 10)
digits[n % 10] += 1;
return digits.All(item => item > 0);
}
编辑:如果是位数组([=14=中的每个位 ]代表一个数字)实现:
private static bool isPandigital(long n) {
// negative numbers can't be pandigital
if (n < 1023456789) // smallest pandigital
return false;
int digits = 0;
for (; n > 0; n /= 10)
digits |= (1 << (int)(n % 10));
// 0b1111111111
return digits == 1023;
}
我认为该方法的作者试图这样做:
static bool IsPandigital(long n) {
int digits = 0;
while (n > 0) {
//set the bit corresponding to the last digit of n to 1 (true)
digits |= 1 << (int)(n % 10);
//remove the last digit of n
n /= 10;
}
//digits must be equal to 1111111111 (in binary)
return digits == (1 << 10) - 1;
}
<<
运算符并不难。你只需要用二进制来思考。
1 << 0 只是一个 1 移位的零位,所以 1
1 << 1 是 10
1 << 2 是 100,等等
如果你遇到一个 2 和一个 5 并且你 'or' 他们在一起你将有 100100.
这意味着如果您遇到所有 10 个数字,最终结果将是十个 1。
在 return 语句中,我们检查数字是否等于十个 1。
1 << 10 表示 10000000000。如果减去 1,则得到 1111111111
当然,所有这些都是二进制的。
他可能对 pandigital 有不同的定义,或者只是不同的要求。例如,如果不允许使用零,您只需将最后一行更改为:digits == (1 << 10) - 2;