P1055 ISBN号码解析

· · 个人记录

题目分析

本题大意:将识别码中是数字的部分取出来再计算,需要累加器。以下简称sum,识别码中为数字的第i项为a[i]

旁边是sum的计算方法:sum = a[1] * 1 + a[2] * 2 + a[3] * 3 ...... + a[9] * 9 。得到sum之后,应对11取余,若为10,则验证码为X。若发现与输入不符,则需输出正确的识别码。

本题因含有分隔符“-”而有些难度,不过只需要加上几个判断也能解决。

代码分析

#include<iostream>
//#include<bits/stdc++.h>
using namespace std;
char a[20];

使用char数组存储标识符。

int main()
{
    int q = 0,sum = 0;//乘数,累加器
    cin >> a;
    for(int i = 0;i <= 10;i++)
    {
        if(a[i] != '-')
        {
            q++;
            sum += int(a[i] - '0') * q;//因为使用的是char数组,因此还原数字时需要减掉0的ASCLL码。
        }
    }
    sum %= 11;

如果输入的a[i]是数字,那么乘数+1,累加器按公式累加,最后按规则取余。

    char c;
    if(sum == 10) c = 'X';
    else c = sum + '0';//识别码处理
    if(c == a[12]) cout<< "Right" <<endl;//因为从0开始输入,所以第十三位实际上是a[12]。
    else
    {
        a[12] = c;
        cout<< a <<endl;//更改为正确的并输出。
    }
    return 0;
}

代码全貌

#include<iostream>
//#include<bits/stdc++.h>
using namespace std;
char a[20];
int main()
{
    int q = 0,sum = 0;
    cin >> a;
    for(int i = 0;i <= 10;i++)
    {
        if(a[i] != '-')
        {
            q++;
            sum += int(a[i] - '0') * q;
        }
    }
    sum %= 11;
    char c;
    if(sum == 10) c = 'X';
    else c = sum + '0';
    if(c == a[12]) cout<< "Right" <<endl;
    else
    {
        a[12] = c;
        cout<< a <<endl;
    }
    return 0;
}