洛谷 超级详解 P1055 [NOIP2008 普及组] ISBN 号码 能力全面提升综合题单1.3

题目解析:

输入:一串字符串called什么玩意ISBN码,由最重要用来计算结果的前九位数字,以及给出的有待考究是否正确的结果数字码,还有三个设限增加难度的杠杆‘-’

输出:看题目得那些消息就是一堆屁事要分析分类。给出结果正确了输入right,错了就输出正确的答案。

思路:

首先肯定就是先把输入的这一串字符串给他赛进数组里头,所以首先创立个数组,再然后写个输入字符串的东西。然后输入字符串后,联合题目要求判断识别码是否正确,则我们需要单独将识别码给他拎出来,因为识别码是在数组的最后一位,则我们可以创建一个变量叫做last,令last等于字符串最后一位。注意:我们创立的数组num为char类型,char类型是以二进制的形式存储ascll码值,在输出时以ascll码值所对应的数值输出。所以我们这里使得int类型的last变量等于char类型字符时,实际等于的是该字符对应的ascll码值。而数字0~9对应的ascll码为49~59。所以我们为使得last实际对应的为真实的整型数字,则我们需要让last-48。举例解释:last对应num数组最后一位且最后一位字符是‘0’,但字符‘0’对应的是ascll码48,则我们让last-48后得到的last就等于了0,达到了目的。(ascll码表在文章最后)

则进行完如上操作后我们应该对最后一位识别码进行判断,判断是否正确,即我们可以写一个自定义函数命名为judge帮助我们进行判断操作。(定义自定义函数及其参数)(使用自定义函数及其参数)

在进入函数后,我们来详细讲讲函数是如何实现判断以及最后的输出的呢。首先理解题目中意思。第一位数字乘以加上后一位数字乘2,以此类推。第i位数字乘以i,加上前i-1位运算的总和。所以创建一个变量atp表示总和。

所以我们创建一个for循环数组用来循环遍历数组(一共只有九个数字位需要计算),然后创建变量i用来代表正在运算第i次循环,对第i位数字运算。

因为第一位数字是乘1,所以等于它本身,即直接初始化atp==num[0]-48,便省过了第一次循环的计算,以及回避了在循环遍历第一个杠杠-时,i不在代表第几位数字位的情况。

为更易理解的说,如果定义i=0,初始化atp=0,则我们需要电脑循环时运算第一数字位,并且第一数字位后,for循环i++,,紧接着一个分隔符杠杠-,我们需要额外循环跳过本次循环,i再++,紧接着第三次循环i=2时遍历到第三个数字位,但是已经不再能写作第i位数字乘i的形式了,因为i为三,不是二。而我们直接初始化i=1,atp=第一数字位后,遍历第一个杠杠后i++,i=2,然后到了第二数字位,且恰好i=2.

但可惜的是紧接着的三次数字位后又紧接着一个分隔符杠杠-,让i不再代表着第i位数字位,第一次让i大于数字位1位所以我们对此进行分类处理。

首先我们首先要能够排除在遍历杠杠时,不运算杠杠代表的ascll码值。则我们又需要单拎出来0~9的ascll码值,使得仅在检测到遍历到当前数组的元素为0~9才进行运算。注意:这里一定要用单引号括出数字,因为这样才代表的是字符’0‘~‘9’而不是整型0~9。然后在判断完是否是杠杠后,我们要分类处理i是否是第i位数字位这个情况了。根据给出的ISBN码样例知道,在经过我们第一次处理i=1以及初始化atp=num[0]-48的前提下,(第一种情况)我们遍历数组遇到的前三位数字位i都代表着第i位数字,直到i=5遇到了上文提到的情况时。num[i]代表了第二个分隔符,(第二种情况)然后i++,i=6代表了第五位数字位,则我们紧接着的又五位数字位每个i都大一,所以我们额外处理,使得第num[i]代表的数字位乘以    (i-1),然后对这两种情况进行处理运算加给atp,这里用到了中间变量mid。

最终进行最终运算mod11然后判断对错进行输出即可,如果atp%11==10,则最后识别码应该是‘X’,如果对了输出Right,不对的话就把‘X'替换数组num的识别码,然后输出识别码即可。如果atp%11!=10,的话直接判断识别码是否等于atp%=11,如果等于那就输出Right,不等于那就替换数组最后一位为正确识别码,然后输出数组字符

完整代码参上:

#include<stdio.h>
void judge(char num[15], int last)
{
    int atp = num[0]-48 ;
    for (int i = 1; i < 11; i++)
    {
        if (num[i] >= '0' && num[i] <= '9'&&i>=2&&i<5)
        {
            int mid = num[i] - 48;
            atp += mid * i;
        }
        else if (num[i] >= '0' && num[i] <= '9' && i > 5)
        {
            int mid = num[i] - 48;
            atp += mid * (i-1);
        }
    
    }
    atp %= 11;
    if (atp == last&&atp!=10)
        printf("Right");
    else if(last==40&&atp==10)
        printf("Right");
    else if(atp!=last&&atp!=10)
    {
        num[12] = atp+48;
        printf("%s", num);
    }
    else if(last!=40&&atp==10)
   {
    num[12]='X';
    printf("%s",num);
   }
}
int main()
{
    char num[15];
    int last;
    scanf("%s", num);
    last= num[12]-48;
    judge(num, last);
        return 0;
}

附录:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值