题目传送门:P1055 ISBN号码
首先,这个题目本身并不是很难,主要在于一些细节的处理,比如这是一个字符串的题目,对于字符串而言我本身是比较薄弱的。
而且,还有对于'X'的单独处理,刚开始都没有注意到,以至于踩了好多坑,从开始的WA,到50分,再到70,然后是80,最后AC,本菜鸡的心情真是.......(此处省略一万字)。
废话不说直接上代码(下面有解释):
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
char a[15], mod[15] = "0123456789X";//先定义一个mod数组来存放整除11之后的数
int s = 0, cnt = 1;
gets(a);
for(int i = 0; i < 12; ++i)
{
if(a[i] == '-')
continue;
s += (a[i]-'0')*cnt++;
}//此循环是为了求和,其中这个if语句很细节(个人觉得),处理的不错。
if(a[12] == mod[s%11])//如果输入的第12个字符等于模除11之后的数,那么说明就是正确的,这时候mod数组的作用就体现出来了。
printf("Right\n");
else//否则的重新计算正确的。
{
a[12] = mod[s%11];
puts(a);
}
return 0;
}
这样做虽然可以AC,但在洛谷上会有一个提示,说的啥我也没看懂,自己可以去试一下,大概就是gets比较危险啥的,,
然后小蒟蒻查看了一下其他神犇的代码,发现了一个暴力输入的好方法。
就是用scanf输入:在c++中,scanf有一个神奇的功能:可以跳过一些字符。 例如:scanf("%d,%d",&a,&b);,当输入1,2时,scanf跳过了“,”,把1赋给a,把2赋给b。现在,我们可以这样读入: scanf("%d-%d-%d-",&a[1],&a[2],&a[3]);这样,我们不利用getchar来读无用的“-”,而使用scanf的特性。
同时,也让我对scanf有了更深的了解。
另一种方法如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
char a[14], ch1, ch2;
int s = 0;
scanf("%c-%c%c%c-%c%c%c%c%c-%c", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &ch1);//暴力读入
for(int i = 1; i <= 9; ++i)//for循环求和
s += (a[i]-'0')*i;
ch2 = s%11+'0';
if(ch2 == 10+'0')//如果余数是10则特殊处理,赋值为X(注意是大写)!!!
ch2 = 'X';
if(ch1 == ch2)
printf("Right\n");
else
printf("%c-%c%c%c-%c%c%c%c%c-%c\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], ch2);//暴力输出
return 0;
}
看完了这个如果对scanf还不是很了解:这里有对scanf的详细解释:
https://blog.youkuaiyun.com/qq_31038073/article/details/85317251