pta——出生年,查验身份证(c语言)

8月15日程序设计实训个人编程

7-1 出生年

在这里插入图片描述
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001

这题碎碎念有点长:开始写这道题的时候因为时间很紧迫加上脑子抽筋,就把题目理解成输入年份的每一位数字和输出年份的每一个数字都不一样(1988到2000)。都写好了提交了好几次才发现我把题理解错了!然后又写,只部分通过,过了提交时间之后我去搜别人的代码我才发现:不一样的数字要绝对的等于你输入的那个 n,不能大于等于!

#include <stdio.h>
int main(){   
    int a1,a2,a3,a4;
    int y, n;  
     scanf("%d %d",&y,&n);
    int i, count = 0;   
    for(i=y; i<3001; i++){       
        count = 1;       
        a1 = i/1000;      
        a2 = i/100%10;       
        a3 = i/10%10;       
        a4 = i%10;
        if(a1 != a2 && a1 != a3 && a1 != a4) count++;      
        if(a2 != a3 && a2 != a4) count++;        
        if(a3 != a4) count++;
        if(count==n) {
        	printf("%d ",i-y);
        	break; 
		} 
    }   
        printf("%04d\n",i);      
        return 0;
}

在这里插入图片描述
ssn:没有写测试点提醒就很难,不知道自己哪错了。最后试出来是边界的问题,把循环改成i<4000就全对了。

7-2 查验身份证

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed

碎碎念:没做出来原因:一,上面那道题耽误时间了。二,语文水平太差短时间没有读明白题意(也比上一题理解错了好)。三,我竟然不明白加权求和是什么意思!!!淦!
不保证全对:

#include<stdio.h>
int main()
{
	char M[12]={'1','0','X','9','8','7','6','5','4','3','2'},num[19];
	int jiaquan[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int N,sum,flag=0;
	scanf("%d",&N);
	while(N--){
		sum = 0;
		scanf("%s",num);
		for(int i=0;i<17;i++){
			sum += (num[i]-'0')*jiaquan[i];
		}
		sum %= 11;
		if(num[17]!=M[sum]){
			flag = 1;
			printf("%s\n",num);
		}
	}
	if(flag == 0)
	    printf("All passed\n");
	return 0;
 } 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜·肉多多·狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值