2014-12-28 46 views
0

我试图让使用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 

正如你所看到的,它会产生很少的数字,但是错过了最多,并且也增加了一些其他数字。

+0

一些有趣的使用Python的存在,但到底是什么'| ='怎么办?它为我提供了一个SyntaxError(虽然在Python 3上),我在网上找不到任何东西。 – HarryCBurn

+0

这是一个按位相等的OR。它与以下内容相同:'ROW [row] = ROW [row] | 1 << cur_char' –

+0

您已将ROW定义为char数组,但在其他位置将其称为int数组。这是什么?当ROW是一个char数组,并且cur_char是8或更大时,你将会遇到ROW [row] | = 1 << cur_char;的溢出问题。 – Dunes

回答

0

哦,设法使它工作:感谢Weather Vane和Dunes。这是两个错误。

1)我没有初始化ROW和2)我使用的是char数组,而不是int。

这种固定的两个错误:

int ROW[9] = {0,0,0,0,0,0,0,0,0}; 

结果:

ROW 0 has numbers: 8 
ROW 1 has numbers: 3, 6 
ROW 2 has numbers: 2, 7, 9 
ROW 3 has numbers: 5, 7 
ROW 4 has numbers: 4, 5, 7 
ROW 5 has numbers: 1, 3 
ROW 6 has numbers: 1, 6, 8 
ROW 7 has numbers: 1, 5, 8 
ROW 8 has numbers: 4, 9 
+0

我标记为社区wiki,因为我没有自己得到答案。但是没有任何其他答案解决了这两个错误 –

2

放眼线

ROW[row] |= 1 << cur_char; 

我看到两个故障。首先,ROW[]尚未初始化,因此您使用的是未初始化的值。其次,C字符串puzzle[]的第一个字符是'8',它是ascii 56.因此,移动1 << 56是没有意义的,并且是UB,尽管我不知道Python如何处理这个问题。