洛谷 简单字符串 'P1055ISBN号码' 问题

题目描述如下:

知识点①:char数组与int型数字进行运算时,需要将 char[i]-'0' 。比如

    char c[5];
    int i;
    for(i=0;i<5;i++)
    scanf("%c",&c[i]);
    printf("%d",c[0]);

当输入c[0] = 5时,以%d形式输出c[0] ,输出结果为 53,所以在进行运算是需要减去48。

注意①:在进行简单的数组运算时,一定要保证下标的计算正确,不要出现低级错误。

我的题解(只有80分):

#include <stdio.h>
int main(){
    char ISBN[30];
    int i = 0, j = 0, t;
    int sub = 0;
    for(i = 0; i < 14; i++){
        scanf("%c", &ISBN[i]); 
    }
    for(i = 0; i <= 11; i++){
        if(i!=1 && i!=5 && i!=11){
            j+=1;
            sub = sub + j * (ISBN[i]-'0'); 
        }
    }
    t = sub%11;    
    if(t == (ISBN[12]-'0')){
        printf("Right");
        return 0;
    }    
    if(t == 10){
        ISBN[12] = 'X';
        for(i = 0; i <= 12; i++)
        printf("%c", ISBN[i]);
        return 0;
    }
        ISBN[12] = t+'0';
        for(i = 0; i <= 12; i++)
        printf("%c", ISBN[i]);
    return 0;            
} 

 

优质题解:

#include <stdio.h>//代码简洁明了(个人观点)
int main(void){
  char a[14], mod[12] = "0123456789X"; //先将mod11后的十一个字符存入数组
  gets(a); //输入字符串
  int i, j = 1, t = 0;
  for(i = 0; i < 12; i++) {
        if(a[i] == '-') continue; //字符串为分隔符‘-’时跳过此次循环进入下一次循环
    t += (a[i]-'0')*j++; //t储存 第j个  数字  * j 的和
  }
  if(mod[t%11] == a[12]) printf("Right");
  else {
      a[12] = mod[t%11]; //若识别码错误,则赋正确的识别码,然后输出
      puts(a);
  }
  return 0;
}

 ------来源于洛谷作者:小k 

 

 

 

定义了一个mod数组,一共有11个值,"0123456789X" ,

a[12] = mod[t%11]; //若识别码错误,则赋正确的识别码,然后输出

 

posted @ 2019-05-17 21:59  EPEP  阅读(324)  评论(0编辑  收藏  举报