关于校验码代码的问题

问题遇到的现象和发生背景

问题如下:

img

输入格式:
只有一行,为一个长度不超过1000且仅包含数字的字符串。

输出格式:
为上述规则下该字符串的校验和。测试用例保证所有整数可以用 int存储。

输入样例:
85302688978758327
输出样例:
21

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char string[1000];
    int a[17]={13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11};
    int i,l,sum=0;
    scanf("%s",string);
    l=strlen(string);
    for(i=0;i<l;i++)
    {
        sum=sum+(string[l-1-i]-'0')*a[(l-1-i)%17];
    }
    printf("%d",sum%23);
}

运行结果及报错内容

img

我想要达到的结果

以此题为例:
21

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char string[1000];
    int a[17]={13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11};
    int i,l,sum=0;
    scanf("%s",string);
    l=strlen(string);
    for(i=0;i<l;i++)
    {
        sum+=(string[l-1-i]-'0')*a[(i+1)%17]; //从低位向高位数,低位 n 从1 开始
        //sum=sum+(string[l-1-i]-'0')*a[(l-1-i)%17];
    }
    printf("%d",sum%23);
    return 0;
}

思路:先翻转字符串,然后依次对乘积相加。

img


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char string[1000];
    int a[17] = { 13,16,30,17,8,24,21,3,9,12,10,4,6,14,15,29,11 };
    int i, l, sum = 0;
    scanf("%s", string);
    l = strlen(string);
    char *pStr = _strrev(string);  //add
    printf("%s\n", pStr);  //add
    for (i = 0; i < l; i++)
    {
        //sum = sum + (string[l - 1 - i] - '0') * a[(l - 1 - i) % 17];
        sum = sum + (pStr[i]-'0') * a[(i+1) % 17];  // modify
    }
    printf("%d", sum % 23);

    return 0;
}