我试图让使用C.位操作出现误导输出
我用我在Python做了同样的tecnhinc一个数独解算器的一个小一点,我有在Python,但它产生不同的结果。也许Python正在削减我不知道的一些优势。
首先,我需要81个字符长的字符串,并将其转换为INT [9] [9],就像这样:
char puzzle[] = "800000000003600000070090200050007000000045700000100030001000068008500010090000400";
int PUZZLE[9][9];
for (int i = 0; i < 81; i++){
int cur_char = puzzle[i];
PUZZLE[row][column] = cur_char;
column ++;
if ((i+1)%9==0){
column = 0;
row ++;
}
然后我做到这一点位操作到int ROW[9]
:
ROW[row] |= 1<<cur_char;
去trought所有的行/列后,我可以检查一个数是行/列做:
if(ROW[i] & 1 << j) printf("ROW: %d has number: %d\n",i,j);
即使有一个未填充的未填充网格,其中有9个9。它给我这个:
ROW: 0 has number: 1
ROW: 0 has number: 2
ROW: 0 has number: 3
ROW: 0 has number: 4
ROW: 0 has number: 6
ROW: 3 has number: 1
ROW: 3 has number: 3
ROW: 3 has number: 4
ROW: 3 has number: 5
ROW: 5 has number: 5
ROW: 5 has number: 6
ROW: 6 has number: 2
ROW: 6 has number: 6
ROW: 7 has number: 1
ROW: 7 has number: 7
ROW: 7 has number: 8
ROW: 7 has number: 9
这里是我的C代码:
#include <stdio.h>
int main(){
char puzzle[] = "800000000003600000070090200050007000000045700000100030001000068008500010090000400";
int PUZZLE[9][9];
char ROW[9];
int row = 0;
int column = 0;
int i;
for (i = 0; i < 81; i++){
int cur_char = puzzle[i];
PUZZLE[row][column] = cur_char;
ROW[row] |= 1 << cur_char;
column ++;
if ((i+1)%9==0){
column = 0;
row ++;
}
}
int j;
for (i = 0; i < 9; i ++) {
for (j = 1; j < 10; j ++) {
if(ROW[i] & 1 << j) printf("ROW: %d has number: %d\n",i,j);
}
}
return 0;
}
这里是我的Python代码:
puzzle = "800000000003600000070090200050007000000045700000100030001000068008500010090000400"
PUZZLE = [[0]*9]*9
ROW = [0]*9
row = 0
column = 0
for i in xrange(81): # not the pythonic way, but the equivalent in C
cur_char = int(puzzle[i])
PUZZLE[row][column] = cur_char
ROW[row] |= 1 << cur_char
column += 1
if (i+1)%9==0:
row += 1
column = 0
for i in xrange(9):
for j in xrange(1,10):
if ROW[i] & 1 << j:
print "ROW: %d has number: %d"%(i,j)
我的问题是:为什么C代码没有给予同样的结果作为Python;虽然它是相同的算法?
编辑:
正如指出的那样,我现在草签焦炭ROW[9] = {0,0,0,0,0,0,0,0,0};
也从cur_char卸下额外48 int cur_char = puzzle[i] - 48;
Ç产量:
ROW: 0 has number: 7 #wrong
ROW: 0 has number: 8 #right
ROW: 0 has number: 9 #wrong
ROW: 1 has number: 2 #wrong
ROW: 1 has number: 5 #wrong
ROW: 2 has number: 1 #wrong
ROW: 2 has number: 6 #wrong
ROW: 3 has number: 4 #wrong
ROW: 3 has number: 6 #wrong
ROW: 4 has number: 3 #wrong
ROW: 4 has number: 4 #right
ROW: 4 has number: 6 #wrong
ROW: 5 has number: 2 #wrong
ROW: 6 has number: 5 #wrong
ROW: 6 has number: 7 #wrong
ROW: 6 has number: 8 #right
ROW: 6 has number: 9 #wrong
ROW: 7 has number: 4 #wrong
ROW: 7 has number: 7 #wrong
ROW: 7 has number: 8 #right
ROW: 7 has number: 9 #wrong
ROW: 8 has number: 3 #wrong
Python的收益率:
ROW: 0 has number: 8
ROW: 1 has number: 3
ROW: 1 has number: 6
ROW: 2 has number: 2
ROW: 2 has number: 7
ROW: 2 has number: 9
ROW: 3 has number: 5
ROW: 3 has number: 7
ROW: 4 has number: 4
ROW: 4 has number: 5
ROW: 4 has number: 7
ROW: 5 has number: 1
ROW: 5 has number: 3
ROW: 6 has number: 1
ROW: 6 has number: 6
ROW: 6 has number: 8
ROW: 7 has number: 1
ROW: 7 has number: 5
ROW: 7 has number: 8
ROW: 8 has number: 4
ROW: 8 has number: 9
正如你所看到的,它会产生很少的数字,但是错过了最多,并且也增加了一些其他数字。
一些有趣的使用Python的存在,但到底是什么'| ='怎么办?它为我提供了一个SyntaxError(虽然在Python 3上),我在网上找不到任何东西。 – HarryCBurn
这是一个按位相等的OR。它与以下内容相同:'ROW [row] = ROW [row] | 1 << cur_char' –
您已将ROW定义为char数组,但在其他位置将其称为int数组。这是什么?当ROW是一个char数组,并且cur_char是8或更大时,你将会遇到ROW [row] | = 1 << cur_char;的溢出问题。 – Dunes