26考研------计算机考研复试------0854(2)
1、题目一
用户首先输入待入库快递的数量,然后一行输入一个快递的取单号,计算不同字母(区
分大小写),分别有多少件。
输入:
4
A5262
C6965
B1858
A2597
输出:
A:2
B:1
C:1
C
#include<stdio.h>
#include <string.h>
int main()
{
int num = 0;
scanf("%d",&num);
getchar();//消除scanf后的换行符
int i,j;
int upper[1000] = {0};
int lower[1000] = {0};
char ch;
for(i = 0;i<num;i++){
int index = 0;
char quNum[100];
while((ch = getchar())!='\n' && index<100){
quNum[index] = ch;
index++;
}
for(j = 0;j<index;j++){
if(quNum[j]<='Z'&&quNum[j]>='A'){
int cur = quNum[j]-'A';
upper[cur]++;
}else if(quNum[j]<='z'&&quNum[j]>='a'){
int cur = quNum[j]-'a';
lower[cur]++;
}
}
}
int x,y;
//打印大写
for(x = 0;x<100;x++){
if(upper[x]!=0)
printf("%c:%d\n",x+'A',upper[x]);
}
//打印小写
for(y = 0;y<100;y++){
if(lower[y]!=0)
printf("%c:%d\n",y+'a',lower[y]);
}
return 0;
}
2、题目二
计算某停车场停车用户应该缴纳费用多少。
计费规则:用户每日首次停车在 60 分钟内免费,超出 60 分钟以后,每小时 5 元,不足一小
时,按照一小时来计算
输入数据:
一共有多少条记录
车牌号 入场时间 出场时间
所有数据都在同一天内
输出数据:
车牌号 应缴纳的费用
注意输出格式,输出车牌顺序按照入场数据
输入:
5
A8569 0 5
A9857 15 75
A8569 5 130
A1123 65 120
A4458 10 130
输出:
A8569 15
A9857 0
A1123 0
A4458 5
c
#include<stdio.h>
#include <string.h>
typedef struct car{
char carNum[10];
int inTime;
int outTime;
int flag;//记录该车是否是第一次进入
int money;
}Car;
int main(){
int num = 0;
scanf("%d",&num);
getchar();//消除scanf后的换行符
int i,j;
Car car[num];
// 初始化flag为1(每辆车第一次进入)
for(i=0;i<num;i++){
car[i].flag = 1;
car[i].money = 0;
}
// 读取数据
for(i=0;i<num;i++){
scanf("%s %d %d",car[i].carNum,&car[i].inTime,&car[i].outTime);
}
for(i=0;i<num;i++){
int curTime = car[i].outTime-car[i].inTime;
if(car[i].flag==1){
if(curTime<=60){
car[i].money = 0;
}else{
int extraTime = curTime -60;
int hour = (extraTime+59)/60;
car[i].money = hour*5;
}
car[i].flag = 0;
}else{//不是第一次进场的车
int hour = (curTime+59)/60;
car[i].money = hour*5;
}
}
//判断是否是同一辆车
for(i = 0;i<num;i++){
for(j = i+1;j<num;j++){//从第二辆车开始判断是否是同一辆车
if(strcmp(car[i].carNum,car[j].carNum)==0){
car[j].money+=car[i].money;//将第一次的费用加到第二次上
car[i].money = 0;//第一次的费用清零
//car[j].flag = 0;
}
}
}
// 输出结果:只输出每个车牌最后一次出现的记录
for(i = 0;i < num;i++){
// 判断是否是最后一次出现
int isLast = 1;
for(j = i+1;j < num;j++){
if(strcmp(car[i].carNum, car[j].carNum) == 0){
isLast = 0;
break;
}
}
if(isLast){ // 只输出最后一次出现的记录
printf("%s %d\n", car[i].carNum, car[i].money);
}
}
return 0;
}
3、题目三
设计某图书管理系统,计算某本书被借的学生的学生编号
输入数据:
记录条数学生编号 图书编号
图书编号
输出数据:
图书编号 学生编号 1 学生编号 2...
3
A123 1
B456 2
C789 1
1
1 A123 C789
c
#include<stdio.h>
#include <string.h>
typedef struct regard{
char stuId[100];
int bookId;
}Regard;
int main(){
int num = 0;
scanf("%d",&num);
getchar();
int i,j;
int searchNum = 0;
Regard regard[num];
//输入记录
for(i = 0;i<num;i++){
scanf("%s %d",regard[i].stuId,®ard[i].bookId);
}
//输入要查询的图书编号
scanf("%d",&searchNum);
printf("%d",searchNum);
for(j = 0;j<num;j++){
if(regard[j].bookId==searchNum){
printf(" %s",regard[j].stuId);
}
}
return 0;
}
4、题目四
给定一个整形数据,将其转化为字符串格式输出。(注:禁止使用 C 语言任何库函数)
例:
输入:12390
输出:12390
c
#include<stdio.h>
#include <string.h>
int main(){
int num;
scanf("%d",&num);
int origin = num;
char c[100];
int i = 0;
int count = 0;
while(origin>0){
int tail = origin%10;
count++;
origin = origin/10;
}
//printf("%d",count);
int j = count-1;
while(num>0){
int tail = num%10;
c[j] = tail+'0';
j--;
num = num/10;
}
c[count] = '\0';
printf("%s",c);
return 0;
}
5、题目五
给定一个数组,输出其中所有是 7 的倍数但不是 4 的倍数的所有值。
例:
输入:[2,7,65,42,15,28]
输出:7 42
c
#include<stdio.h>
#include <string.h>
int main(){
int arr[100];
int i = 0;
getchar();//读'['
while(scanf("%d",&arr[i])==1){
i++;
char ch = getchar();
if(ch==']'){
break;
}
}
int l = i-1;
for(i = 0;i<l;i++){
if((arr[i]%7==0)&&(arr[i]%4!=0)){
printf("%d ",arr[i]);
}
}
return 0;
}
6、题目六
给定二维数组,将奇数行进行升序排序,偶数行进行降序排序
例:
输入
2 , 4 , 23, 1, 5
6, 4, 5, 32, 1
5, 7, 3, 45,1
输出:
1 4 2 5 23
32 6 5 4 1
1 3 5 7 45
7、题目七
自然常数 e 可以用级数 1 + 1/1! + 1/2! + ... + 1/n! + ... 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n (≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
输入样例:
10
输出样例:
2.71828180
c
#include<stdio.h>
#include <string.h>
double fn(int num){
if(num==1||num==0){
return 1;
}
double ret = 1;
int i;
for( i = num;i>0;i--){
ret*=i*1.0;
}
return ret;
}
int main(){
int num = 0;
scanf("%d",&num);
double ret = 0.0;
int i;
for( i = 0;i<=num;i++){
ret+=1.0/fn(i);
}
printf("%.8lf",ret);
return 0;
}
8、题目八
有一个8层灯塔,每层的灯数都是上一层的2倍,共有765盏灯。编程求最上层的灯数。
c
#include<stdio.h>
#include <string.h>
int main(){
int height = 8;
int total = 765;
int i;
int bei = 1;
int initNum = 0;
int sum = 1;
for(i = 1;i<height;i++){
bei*=2;
sum+=bei;
}
initNum = total/sum;
printf("%d",initNum);
9、题目九
有ab两个人,互为对手,相隔一段距离,给出2个人的xy坐标,根据公式可算距离,根据两人的攻击半径和攻击力量判定输赢。
若距离大于x或y的坐标,则无人受伤;否则xy坐标输入为负值。
若在攻击范围内,力量大的获胜。
输入的ab两人xy坐标,攻击半径,攻击力量大小输出判断输赢。
输入输出格式
输入描述:
第一行输入a的坐标,攻击半径,攻击力量
第二行输入b的坐标,攻击半径,攻击力量
输出描述:
如果a胜,输出"a win"
如果b胜,输出"b win"
如果无人受伤,输出"no onhurt"
c
#include<stdio.h>
#include <string.h>
#include <math.h>
typedef struct npc{
int x;
int y;
int r;
int power;
}Npc;
int main(){
int i = 0;
Npc npc[2];
scanf("%d %d %d %d",&npc[0].x,&npc[0].y,&npc[0].r,&npc[0].power);
getchar();
scanf("%d %d %d %d",&npc[1].x,&npc[1].y,&npc[1].r,&npc[1].power);
double distance = sqrt(((npc[1].x-npc[0].x)*(npc[1].x-npc[0].x))+((npc[1].y-npc[0].y)*(npc[1].y-npc[0].y)));
if(npc[0].r*1.0<distance&&npc[1].r*1.0<distance){
printf("no one hurt");
}else if(npc[0].r*1.0>distance&&npc[1].r*1.0<distance){
printf("a win");
}else if(npc[1].r*1.0>distance&&npc[0].r*1.0<distance){
printf("b win");
}else if(npc[0].r*1.0>=distance && npc[1].r*1.0>=distance){
if(npc[0].power>npc[1].power){
printf("a win");
}else if(npc[0].power<npc[1].power){
printf("b win");
}else{
printf("no one hurt");
}
}
return 0;
}
10、题目十
给一个数组(不是有序的),找出这个数组中出现次数 6 次及以上的数,有则打印出来,无则输出无(假设只有一个这样的数)
c
#include<stdio.h>
#include <string.h>
#include <math.h>
int main(){
int arr[100];
int i = 0;
getchar();//读'['
while(scanf("%d",&arr[i])==1){
i++;
char ch = getchar();
if(ch==']'){
break;
}
}
int count = i;
int ret = 0;
int j,k;
int found = 0;
for(j = 0;j<count;j++){
int ret = 0; // 每次循环重置计数器
for(k = j+1;k<count;k++){
if(arr[j]==arr[k]){
ret++;
}
}
if(ret>=6){
printf("%d ",arr[j]);
found = 1;
break;
}
}
// 没找到则输出"无"
if(!found){
printf("无\n");
}
return 0;
}
11、题目十一
给一个数组,输出数组中除去最大值和最小值的数的平均值
c
#include<stdio.h>
#include <string.h>
#include <math.h>
int main(){
int arr[100];
getchar(); // 读'['
int i = 0;
while(scanf("%d",&arr[i]) == 1){
i++;
char ch = getchar();
if(ch == ']'){
break;
}
}
int length = i;
// 处理边界情况
if(length <= 2){
printf("0.000000\n");
return 0;
}
// 找出最大值和最小值(不修改数组)
int max = arr[0];
int min = arr[0];
for(i = 1; i < length; i++){
if(arr[i] > max) max = arr[i];
if(arr[i] < min) min = arr[i];
}
// 如果最大值等于最小值,说明所有数相同
if(max == min){
printf("0.000000\n");
return 0;
}
// 求和,跳过所有最大值和最小值
int sum = 0;
int count = 0;
for(i = 0; i < length; i++){
if(arr[i] != max && arr[i] != min){
sum += arr[i];
count++;
}
}
double ret = sum * 1.0 / count;
printf("%lf\n", ret);
return 0;
}
12、题目十二
给出n个字符串,对其排序,字符串允许有空格
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
int n;
printf("请输入字符串个数: ");
scanf("%d", &n);
getchar(); // 吸收换行符
// 方法1:使用二维数组(固定长度)
char str[100][1000]; // 最多100个字符串,每个最长1000字符
// 输入n个字符串(允许空格)
printf("请输入%d个字符串:\n", n);
for(int i = 0; i < n; i++) {
// 使用fgets读取整行,包括空格
fgets(str[i], 1000, stdin);
// 去除末尾的换行符
int len = strlen(str[i]);
if(str[i][len-1] == '\n') {
str[i][len-1] = '\0';
}
}
// 冒泡排序
char temp[1000];
for(int i = 0; i < n - 1; i++) {
for(int j = 0; j < n - i - 1; j++) {
if(strcmp(str[j], str[j+1]) > 0) {
// 交换字符串
strcpy(temp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], temp);
}
}
}
// 输出排序结果
printf("\n排序后的结果:\n");
for(int i = 0; i < n; i++) {
printf("%s\n", str[i]);
}
return 0;
}
13 、题目十三
集合运算是一种常见的问题,如找出两个集合中的相同元素和不同元素等。你的任务很简单,找出所有集合中相同的元素。
输入输出格式
输入描述:
三行,第一行是元素的个数 NN (N≤50N ≤50),然后是两行,每行有 NN 个整数,用空格隔开。
输出描述:
两行,第一行为相同元素个数,第二行为相同元素的升序,用空格隔开
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void bubbleSort(int arr[], int n) {
// 外层循环:控制比较轮数
int i,j;
for( i = 0; i < n - 1; i++) {
// 内层循环:进行相邻元素比较和交换
for( j = 0; j < n - i - 1; j++) {
// 如果前一个元素大于后一个元素,交换
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main(){
int num;
scanf("%d",&num);
int origin1 = num;
int origin2 = num;
int arr1[num];
int arr2[num];
int i = 0;
int j = 0;
while(origin1>0){
scanf("%d",&arr1[i]);
origin1--;
i++;
}
getchar();
while(origin2>0){
scanf("%d",&arr2[j]);
origin2--;
j++;
}
int b[num];
int k = 0;
int count = 0;
for(i = 0;i<num;i++){
for(j = 0;j<num;j++){
if(arr1[i]==arr2[j]){
b[k] = arr1[i];
k++;
count++;
}
}
}
bubbleSort(b,count);
printf("%d\n",count);
for(i = 0;i<count;i++){
printf("%d ",b[i]);
}
return 0;
}
14、题目十四
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密。简单的加密算法虽然不足以完全避免情报被破解,但仍然能防止情报被轻易的识别。我们给出一种最简单的加密方法,对给定的一个字符串,把其中从A到Y、a到y的字母用其后继字母替代,把Z和z用A和a替代,其他非字母字符不变,则可得到一个简单的加密字符串。
输入描述:
多组测试数据;
每组数据输入一行,包含一个字符串(保证没有空格),长度小于80个字符。
输出描述:
输出每行字符串的加密字符串。
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
char str[80];
int length;
int i;
while(scanf("%s",str)!='\n'){
length = strlen(str);
for(i=0;i<length;i++){
if(str[i]<='Z'&&str[i]>='A'){
str[i] = str[i]+1;
}else if(str[i]<='z'&&str[i]>='a'){
str[i] = str[i]+1;
}
}
printf("%s",str);
}
return 0;
}
15、题目十五
求n个数的最小公倍数。
输入描述:
多组测试数据,第一行一个数 nn (0<n<=100<n<=10),下面n个数,integer范围内。
输出描述:
这n个数的最小公倍数。
输入输出样例
输入样例#1:
5
6 3 5 4 2
输出样例#1:
60
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
int num = 0;
scanf("%d",&num);
if(num==0){
return 0;
}
int arr[num];
int i;
for(i = 0;i<num;i++) {
scanf("%d",&arr[i]);
}
int ret;
for(i = 0;i<num-1;i++) {
int temp = lcm(arr[i],arr[i+1]);
arr[i+1] = temp;
if(i==num-2){
ret = temp;
}
}
printf("%d",ret);
return 0;
}
16、题目十六
求出菲波那切数列的第n项
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int fn(int num){
if(num==2||num==1){
return 1;
}
return fn(num-1)+fn(num-2);
}
int main(){
int num;
scanf("%d",&num);
int ret = fn(num);
printf("%d",ret);
return 0;
}
17、题目十七
输入一段字符串,把其中的"tantan"都替换为baibai
如果字符串中不含有"tantan",则输出"not find"(不含引号
** 输入样例 **
daaitantanyyd
输出样例:
daaibaibaiyyds
c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char str[1000];
char result[1000] = "";
char temp[1000];
// 输入字符串
gets(str);
int len = strlen(str);
int i = 0;
int found = 0;
while(i < len) {
// 检查当前位置是否是 "tantan"(不区分大小写)
if(i + 5 < len &&
tolower(str[i]) == 't' &&
tolower(str[i+1]) == 'a' &&
tolower(str[i+2]) == 'n' &&
tolower(str[i+3]) == 't' &&
tolower(str[i+4]) == 'a' &&
tolower(str[i+5]) == 'n') {
// 找到 "tantan",替换为 "baibai"
strcat(result, "baibai");
i += 6;
found = 1;
} else {
// 不是 "tantan",直接复制当前字符(转为小写)
char ch = tolower(str[i]);
strncat(result, &ch, 1);
i++;
}
}
// 输出结果
if(found) {
printf("%s\n", result);
} else {
printf("not find\n");
}
return 0;
}
18、题目十八
编写程序实现十进制数到二进制数的转换。
输入输出格式
输入描述:
输入只有一行,就是十进制整数。
输出描述:
转换后的二进制数。
输入输出样例
输入样例#:
10
输出样例#:
1010
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int num;
scanf("%d",&num);
int arr[15];
int i = 0;
// 处理输入为0的特殊情况
if (num == 0) {
printf("0\n");
return 0;
}
while(num>0){
int temp = num%2;
arr[i] = temp;
i++;
num = num/2;
}
int len = i;
int j= 0;
for(j = len-1;j>=0;j--){
printf("%d",arr[j]);
}
return 0;
}
19、题目十九
输入30个数,求出现次数大于等于16的数的个数。若有则输出那个数,没有则输出none。
输入描述:
如题
输出描述:
如题
输入输出样例
输入样例#1:
2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0
输出样例#1:
1
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
int arr[30];
int b[10];
int i;
for(i = 0;i<30;i++){
scanf("%d",&arr[i]);
}
int j;
i = 0;
int count = 0;
int k = 0;
int flag = 0;
for(j = 0;j<30;j++){
int count = 0;
for(i = 0;i<30;i++){
if(arr[j]==arr[i]){
count++;
}
}
if(count>=16)
b[k] = arr[j];
flag =1;
break;
}
if(flag){
printf("%d",b[0]);
}else{
printf("not found\n");
}
return 0;
}
20、题目二十
给你一个只有小写字母的字符串,按照 a = 1, b = 2, c = 3, d = 4, ... z = 26 的方法。求出这个字符串所有字母对应数字之和。
输入描述:
多组测试数据,每组测试数据只有一个字符串
输出描述:
一个整数
输入输出样例
输入样例#0:
youaremylove
输出样例#0:
177
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
char str[100];
int i,j;
int arr[100];
while(scanf("%s",str)!=EOF){
int sum = 0;
int len = strlen(str);
for(i = 0;i<len;i++){
if(str[i]=='a'){
arr[i] = 1;
}else if(str[i]=='b'){
arr[i] = 2;
}else if(str[i]=='c'){
arr[i]=3;
}else if(str[i]=='d'){
arr[i]=4;
}else if(str[i]=='e'){
arr[i]=5;
}else if(str[i]=='f'){
arr[i]=6;
}else if(str[i]=='g'){
arr[i]=7;
}else if(str[i]=='h'){
arr[i]=8;
}else if(str[i]=='i'){
arr[i]=9;
}else if(str[i]=='j'){
arr[i]=10;
}else if(str[i]=='k'){
arr[i]=11;
}else if(str[i]=='l'){
arr[i]=12;
}else if(str[i]=='m'){
arr[i]=13;
}else if(str[i]=='n'){
arr[i]=14;
}else if(str[i]=='o'){
arr[i]=15;
}else if(str[i]=='p'){
arr[i]=16;
}else if(str[i]=='q'){
arr[i]=17;
}else if(str[i]=='r'){
arr[i]=18;
}else if(str[i]=='s'){
arr[i]=19;
}else if(str[i]=='t'){
arr[i]=20;
}else if(str[i]=='u'){
arr[i]=21;
}else if(str[i]=='v'){
arr[i]=22;
}else if(str[i]=='w'){
arr[i]=23;
}else if(str[i]=='x'){
arr[i]=24;
}else if(str[i]=='y'){
arr[i]=25;
}else if(str[i]=='z'){
arr[i]=26;
}
}
for(j = 0;j<i;j++){
sum+=arr[j];
}
printf("%d",sum);
}
// //简便写法
// while(scanf("%s", str) != EOF){
// int sum = 0;
// int len = strlen(str);
//
// for(int i = 0; i < len; i++){
// sum += str[i] - 'a' + 1;
// }
//
// printf("%d\n", sum);
// }
return 0;
}
21、题目二十一
小X在纸上画出了三条线段,请你帮助他判断这三条线段能否构成平面三角形;如果能,并判定三角形的类型,即锐角、直角或钝角。
输入输出格式
输入描述:
第一行输入一个整数T,表示测试数据组数,约1000组。接下来T行每行输入三个整数a, b, c (0<=a, b, c<=1000),表示三角形的三边长。
输出描述:
对于每组数据,输出一个整数,表示答案。若不能构成三角形,输出-1;若构成锐角三角形,输出1;若构成直角三角形,输出2;若构成钝角三角形,输出3。
输入输出样例
输入样例:
text
2
3 4 5
1 2 3
输出样例:
text
2
-1
c
#include<stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main(){
int num;
scanf("%d",&num);
while(num>0){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if((a+b<=c)||(a+c<=b)||(b+c<=a)){
printf("-1");
}else{
if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a)){
printf("2\n");
}else if((a*a+b*b>c*c)||(a*a+c*c>b*b)||(b*b+c*c>a*a)){
printf("1\n");
}else{
printf("3\n");
}
}
num--;
}
return 0;
}
祝各位考生一志愿上岸,金榜提名!!!