PAT乙级考试-1031 查验身份证 (15分)

题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路
(1)使用一个test[]数组来录入当前的号码,使用一个wrong[][]来储存所有有问题的号码,再将权值表和最后一位的字符表用数组储存起来,方便运算
(2)每录入一个号码,就计算其权值以及其对应的第十八位字符是否正确,在计算的过程中顺便检测号码中是否有不是数字的字符,如果有,直接将该号码放入wrong数组,否则计算出对应的字符后和第十八位比较,再决定是否放入wrong数组
(3)根据wrong数组的元素数量,打印对应的内容即可

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
	int n, i, j, k = 0, res = 0;
	scanf("%d", &n);
	char test[19];
	char(*wrong)[19] = (char(*)[19])malloc(n * sizeof(char[19]));
	int rate[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
	char std[11] = { '1','0','X','9','8','7','6','5','4','3','2' };
	for (i = 0; i < n; i++)
	{
		scanf("%s", test);
		for (j = 0; j < 17; j++)
			if (test[j] >= '0' && test[j] <= '9')
				res = res + rate[j] * (test[j] - '0');
			else
			{
				strcpy(wrong[k++], test);
				break;
			}
		if (j < 17)//有字符的情况,就不再进行后续处理
		{
			res = 0;
			continue;
		}
		if (std[res % 11] != test[17])
			strcpy(wrong[k++], test);
		res = 0;
	}
	if (k == 0)
		printf("All passed");
	else
		for (i = 0; i < k; i++)
			printf("%s\n", wrong[i]);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值