2017北理复试机试题

1.

输入身份证号,通过计算比较校验位来判断身份证号是否正确。
如,aaaaaayyyymmddxxsp共18位,其中:
年份代码yyyy共4位。最后一位p为校验位。
校验规则是:

  1. 对前17位数字的权求和 S=Sum(Ai*Wi),i=0,…,16
    Ai:表示第i位置上的身份证号码数字值
    Wi:表示第i位置上的加权因子
    Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  2. 计算模 Y=mod(S,11)
  3. 通过模得到对应的校验码
    Y:0 1 2 3 4 5 6 7 8 9 10
    校验码:1 0 X 9 8 7 6 5 4 3 2

例如,如果得到Y为9则最后的校验位p应该为3。如果校验位不是3,则该身份证号码不正确。

  • 输入示例:
    110130197606175317

  • 输出示例:
    110130197606175317 正确.

  • 输入示例:
    110200197501175220

  • 输出示例:
    应为:11020019750117522X

#include <iostream>
#include <string>
using namespace std;

int main()
{
	int wei[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
	char p[] = { '1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
	string num;
	while (cin >> num) {
		int total = 0, i;
		for (i = 0; i < num.length() - 1; i++) 
			total += (num[i]-'0') * wei[i];
		
		if (p[total % 11] == num[i])
			cout << num << " 正确" << endl;
		else 
			cout << "应为: " << num.substr(0, 17) << p[total % 11] << endl;		
	}
}

2.

显示出如下数组中的所有元素,并使用二分查找法在数组中查找元素。
int a[]={-90,-32,12,16,24,36,45,59,98,120};

  • 输入输出示例
    -90 -32 12 16 24 36 45 59 98 120
    请输入所要查找的元素:24
    输出:第5个元素为24,比较次数为1
    请输入所要查找的元素:120
    输出:第10个元素,比较次数为4
    请输入所要查找的元素:6
    输出:查找失败 比较次数为3
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int bi_search(int a[], int begin, int end, int value,int &cmp)
{
	if (begin > end)
		return -1;
	int m = (begin + end) / 2;
	cmp++;
	if (a[m] > value)
		bi_search(a, begin, m - 1, value, cmp);
	else if (a[m] < value)
		bi_search(a, m + 1, end, value, cmp);
	else
		return m;
}

int main()
{
	int a[] = { -90,-32,12,16,24,36,45,59,98,120 };
	for (int i = 0; i < 10; i++)
		cout << a[i] << ' ';
	cout << "请输入要查找的元素: ";
	int num, cmp;
	while (cin >> num) {
		cmp = 0;
		int res = bi_search(a, 0, 9, num, cmp);
		if (res == -1)
			cout << "查找失败!比较次数为" << cmp << endl;
		else
			cout << "第" << res + 1 << "个元素!比较次数为" << cmp << endl;
	}
}

3.

输入学生个数以及每个学生的姓名和3门课程成绩:输出不及格学生的信息;按平均成绩排序,从高到低输出学生信息。

  • 输入示例:
    5
    zhaoyi 70 80 91
    zhanger 68 40 90
    zhangsan 60 70 80
    lisi 70 80 90
    wangwu 52 70 100
  • 输出示例:
    *name: zhanger score:68 40 99
    *name: wangwu score:52 70 100
    [1] name:zhaoyi 70 80 91
    [2] name:lisi 70 80 90
    [3] name:wangwu 52 70 100
    [4] name:zhangsan 60 70 80
    [5] name:zhanger 68 40 99

和2016年第一题几乎一样,就不写了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值