P1055 ISBN号码

题目传送门: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值