洛谷 简单字符串 '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 @   EPEP  阅读(328)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示