記:全部題目連接https://blog.csdn.net/u014552756/article/details/78505845,題目來源於博主“我還在路上呢”,我根據個人對題目的理解寫了一下題解代碼,分享在博客上,如代碼寫的有問題希望大家指正,後期會不定時更新。
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
思路分析:此題是一個字符串處理的題目,解題思路是根據其給出的規則求出對應參數,在此過程中的關鍵是字符和數字的轉換,以及當校驗碼y=s%11爲2時要做分類處理。
#include <stdio.h>
#include <string.h>
int main()
{
int w[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},s=0,r=0;
char a[18],y[20]={'1','0','X','9','8','7','6','5','4','3','2'};
gets(a);//輸入身份證號
for(int i=0;i<17;i++)
s=s+(a[i]-'0')*w[i];
r=s%11;
if(r==2)
{
char t=y[r];
if(t==a[17])
printf("%s 正確\n",a);
else
{
printf("應爲:");
for(int j=0;j<17;j++)
{
printf("%c",a[j]);
}
printf("%c\n",t);
}
}
else{
int t=y[r]-'0';
if(t==a[17]-'0')
printf("%s 正確\n",a);
else
{
printf("應爲:");
for(int j=0;j<17;j++)
{
printf("%c",a[j]);
}
printf("%d\n",t);
}
}
return 0;
}
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 <stdio.h>
int main()
{
int a[]={-90,-32,12,16,24,36,45,59,98,120};
for(int i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
int n;
printf("請輸入所要查找的元素:");
scanf("%d",&n);
int count=0,t=0;
for(int i=0;i<10;i++)
{
if(a[i]==n)
t=i;//查詢是數組中的第幾個元素,在輸出時要加做1處理
}
int mid,left=0,right=9,f=0;
while(left<=right)//二分查找,記下對應的次數
{
count++;
mid=(left+right)/2;
if(a[mid]==n)
{
f=1;
break;
}
else if(a[mid]>n) right=mid-1;
else left=mid+1;
}
if(f==1)
printf("第%d個元素爲%d,比較次數爲%d\n",t+1,n,count);
else printf("查找失敗,比較次數爲%d\n",count);
return 0;
}
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
思路分析:此題主要運用結構體以及結構體排序來完成,此題的題目數據非常適合用結構體,搞清楚結構體的用法此題非常容易解除。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct Info{
char name[20];
int score[3];
float aveg;
};
bool cmp(Info a,Info b)
{
return a.aveg>b.aveg;
}
int main()
{
int n;
scanf("%d",&n);
Info stu[n];
for(int i=0;i<n;i++)
{
int ave=0,s=0;
scanf("%s",stu[i].name);
for(int j=0;j<3;j++)
{
scanf("%d",&stu[i].score[j]);
s=s+stu[i].score[j];
}
stu[i].aveg=s/3;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<3;j++)
{
if(stu[i].score[j]<60)
printf("*name:%s score:%d %d %d\n",stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
}
}
sort(stu,stu+n,cmp);
int k=1;
for(int i=0;i<n;i++)
{
printf("[%d] name:%s %d %d %d\n",k,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
k++;
}
return 0;
}