题目解析:
输入:一串字符串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;
}