HP Code Wars校验位算法错误

时间:2015-01-10 16:24:50

标签: c windows algorithm

问题: http://www.hpcodewars.org/past/cw17/problems/Prob02--CheckDigit.pdf

这是我的代码:

    int checkdigit(){

    int n,i,j,sum1,sum2,k;

    char ch;
    printf("Enter the number of lines.Then enter ther the codes!");
    scanf("%d",&n);
    char *codes[n];
    int msum[n];
    int fsum[n];
    for(i=0;i<n;++i){
        scanf("%s",codes[i]);
    }
    for(i=0;i<n;++i){
            for(j=0,k=3;j<21;j+=3,k+=3){
        char *num;
        num=codes[i];
        ch=num[j];
        sum1+=atoi(ch);
        if(k<21)
        ch=num[k];
        sum2+=atoi(ch);
    }
    msum[i]=sum1*3;
    fsum[i]=((msum[i]+sum2)%10);
    if(fsum[i]!=0)
        fsum[i]-=10;
 }
       for(k=0;k<sizeof(fsum);k++){
          printf("%s %d",codes[k],fsum[k]);
      }

return 0;
}

在将第一个UPC代码作为输入后,代码现在崩溃。

3 个答案:

答案 0 :(得分:0)

更改

fsum[i]=((msum+sum2)%10);

fsum[i]=((msum[i]+sum2)%10);

这是因为msum是一个整数数组,msum[i]是一个整数。由于msum是一个数组,因此它的类型为int*,与二元运算符int的{​​{1}}不兼容

答案 1 :(得分:0)

下面

char *codes[n];

n指针的数组,你没有为这些指针分配内存并尝试将值扫描到这个位置,所以你看到崩溃

答案 2 :(得分:0)

#include <stdio.h>

int checkdigit(int data[12]){
    int i, even, odd, result;

    even = odd = 0;
    for(i = 0; i < 11; ++i){
        if(i & 1)
            even += data[i];
        else
            odd += data[i];
    }
    result = (odd * 3 + even) % 10;
    if(result)
        result = 10 - result;
    return data[11] = result;
}

int main(){
    int n;
    scanf("%d", &n);
    int codes[n][12];
    int i, j;
    for(i = 0; i < n; ++i){
        for(j = 0; j < 11; ++j){
            scanf("%d", &codes[i][j]);
        }
        checkdigit(codes[i]);
    }
    for(i = 0; i < n; ++i){
        for(j = 0; j < 12; ++j){
            if(j) putchar(' ');
            printf("%d", codes[i][j]);
        }
        putchar('\n');
    }
    return 0;
}