洛谷 简单字符串 '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]; //若识别码错误,则赋正确的识别码,然后输出