nb复试上机题

image

复试野题

1.封建的小张

题目:小张明天要去车管所申请车牌号,可他比较封建。不喜欢包含4或者S的号码。于是小张就在家忐忑不安,寻愿明天能否撞上好远,拿到一个理想的车牌号。请您给入10个长度为8的字符捧代教车牌号,每个字符串占一行且只包含大写字母或者数字,如果有理想的车牌号,请验出最先找到的那个车牌号;如果我不到,请隆出“Not found”.

测试数据:
G5467212
P7777141
P7777141
Q8768080
P7777141
A8888888
B8888888
C8888888
D8888888
E9999999
输出结果:
Q8768080

解决方法:

#include<stdio.h>
#include<string.h>
int main(){
    char str[8];
    int n=0,i;
    while(n<10){
        scanf("%s",str);
        for(i=0;i<8;i++){
            if( (str[i] >='A'&& str[i] <= 'Z')||(str[i] >= '0'&& str[i] <='9')){
                if(str[i]=='S'||str[i]=='4'){
                    n++;
                    break;//直接看下一个车牌
                }       
            }
        }
        if(i==8){
            printf("%s\n",str);
            return 0;
        }
    }
    printf("%s\n","Not found");
    return 0;
}  

2.小张的校验(文件、质数)

题目:现有若干个整数,需要通过网络传给到另外一个地方,但有时候阿络不稳定,会出现接收到的数据出现错误的情况。小张发明了一套方法,他把有用的数据放在第1,3.5..个位置,而把第2,4,6,...等位置设成随机的质数;这些质数并不是有用的信息,只是起到校验作用,当对方接到数据以后,如果发现第2.4.6.等位置上只要有一个数不是质数,那么就判定"数据被篡改”;要不然认为”数据正确无误”,现在有一个文本文件“numbers.txt”,里面存放了接受到的若干个整数,每个整数占一行。请您读取这个文件文件,判断它里面的数据是否被改?
(说明:文件 numbers txt请你自己用notepad创建)

#include<stdio.h>
#include<string.h>
int isPrime(int n);

int main()
{
    char p[100];
    FILE *fp=fopen("number.txt","r");
    if(!fp){
        printf("can't open file\n");
        return -1;
    }
    while(!feof(fp)){
        fscanf(fp,"%s",p);
    }
    fclose(fp);
   
    int error=0;
    int len =strlen(p);
    for(int j=0;j<len;j++){
        if(j%2==1){
            if(isPrime(p[j])==1){  
                error=1;
            }
        } 
    }
    if(error==0)
        printf("%s","数据正确无误");
    else if(error==1)
        printf("%s","数据被篡改");
}  
int isPrime(int n)
{
    n=n-48;
    int i,flag=1;
    if(n==1)
        return 1;
    for(i=2;i<=n-1;i++)
        if(n%i==0){
            flag=0;
            break;
        }
    if(flag==1)
        return 0;//是质数
    else
        return 1;//不是质数
}

3.笑笑买贺卡(贪心算法)

题目:新年快到了,笑笑打算给他的好朋友们发贺年卡,而且它已经选好了自己要购买的贺卡的样式.俗话说得好,货比三家,笑笑来到了商店,看了各个商铺这种贺卡的价钱.不仅如此,笑笑还记住了每个商铺的存货量.已知笑笑打算购买m 张贺卡,问他最少花多少钱.

输入格式:
第一行有两个整数m 和n .其中m 表示要购买贺年卡的数量,n 表示商铺的个数.
以下n 行,每行有两个整数,分别表示该商铺这种贺年卡的单价和存货量.
输出格式:
仅一个数,表示笑笑所花的最少钱数.
输入样例:

要买 行
10 4
单价 存货量
4 3
6 2
8 10
3 6
输出样例:
36
数据规模:
0 < m ,n ≤ 1000
可以保证最后的结果在长整型范围内,商铺的总存货量不少于m .

测试数据:
10 4
4 3
6 2
8 10
3 6
输出结果:
36

解决方法:

#include <stdio.h>
struct shop{
  int price;
  int store;
};
int main(){
  int m,n,i,j;
  scanf("%d%d",&m,&n);
  struct shop p[n];
  for(i=0;i<n;i++){
    scanf("%d%d",&p[i].price,&p[i].store);
  }
  //直接排序 找到最便宜的店,然后把他货全清了
  int min;
  struct shop temp;
  for(i=0;i<n-1;i++){//从小到大
    min=i;
    for(j=i+1;j<n;j++){
      if(p[j].price<p[min].price)
        min=j;
    }
    temp=p[i];
    p[i]=p[min];
    p[min]=temp;
  }
  int money=0;
  i=0;
  while(m>0){
    if(p[i].store>m){//商店存货>我需要的量
      money =money+m*p[i].price;
      m=m-m;
    }else if(p[i].store<=m){
      money =money+p[i].store*p[i].price;
      m=m-p[i].store;
    }
    i++;
  }
  printf("%d",money);

}

4.0-1背包问题(动态规划)

太绝了,这种题怎么做啊,但题实在是太经典了 具体可 参考博客

已知n种物品和一个可容纳C重量的背包,物品i的重量为wi,产生的效益为pi,在装包时物品i可以装入,也可以不装,但不可以拆开装。即物品i可产生的效益为pi,这里xi为0或1。请问如何装包,能使装包总效率最大。
Input
多组测试数据。 每组第一行输入2个整数,分别为C和物品种数n 然后是n行,每行输入2个整数,分别是物品的重量wi和物品产生的效益pi
Output
对于每组数据输出1行,包含2个数分别为装包的重量及产生的效益
-可借助表思考 具体参考 博客

image

Sample Input
60 6
15 32
17 37
20 46
12 26
9 21
14 30
Sample Output
60 134

解决方法:

#include <stdio.h> 
#include <math.h> 
struct bag{
    int weight;
    int money;
};
int main(){
  int n,c,i,j;
  scanf("%d %d",&c,&n);
  struct bag bg[n+1];
  for(i=1;i<=n;i++){
    scanf("%d %d",&bg[i].weight,&bg[i].money);
  }
  int dp[n+1][c+1];
  for(i=0;i<=c;i++){
    dp[0][i]=0;
  }
  for(i=0;i<=n;i++){
    dp[i][0]=0;
  }

  for(i=1;i<=n;i++){
    for(j=1;j<=c;j++){
      if(bg[i].weight<=j){//考虑比较大小,放入
        dp[i][j]=fmax(dp[i-1][j],dp[i-1][j-bg[i].weight]+bg[i].money);
      }else{
        dp[i][j]=dp[i-1][j];//直接抄上一格
      }
    }
  }
  printf("%d %d\n",c,dp[n][c]);
  j=c;
  for(i=n;i>0;i--){
    if(dp[i][j]>dp[i-1][j]){
      printf("%d ",i);
      j=j-bg[i].weight;
    }
    if(j<=0)
      break;
  }
}

2017 914c程序试卷A卷

1.素数分解

验证 2000 以内的正偶数都能够分解为两个素数之和。请写出程序输出分解结果。
解决方法:

#include<stdio.h>   
int isPrime(int n);
int main(){
    int i,n;
	//2000以内的正偶数,从4开始,步长为2 
	for(i=4;i<=2000;i+=2){
		for(n=2;n<i;n++){//将偶数i分解为两个整数 
            if(isPrime(n)==0&&isPrime(i-n)==0){
                printf("%d=%d+%d\n",i,n,i-n);
                break;
            }
		}
	}
return 0;   
}
//判断质数
int isPrime(int n){
    int i,flag=1;
    if(n==1)
        return 1;
    for(i=2;i<=n-1;i++)
        if(n%i==0){
            flag=0;
            break;
        }
    if(flag==1)
        return 0;//是质数
    else
        return 1;//不是质数
}

2.颠倒该字符串输出

键盘输入一串字符(长度不超过 100),保留其中大小写英文字母、空格和英文句号’.’,删除其余字符并屏幕输出结果,然后颠倒该字符串输出。

输入样例:
.#tne^du(t6s! a %ma9 I
输出样例:
.tneduts a ma I
I am a student.

解决方法:

//还是直接新加一个数组不会出错
//gets用不了了,现在用fgets(str, 100, stdin);且用scanf会在空格处自动截断
#include<stdio.h>
#include <string.h>
int main()
{
	char str[100],brr[100];
	fgets(str, 100, stdin);
	int lenstr,lenbrr,i,n=0;
	char a;
	lenstr=strlen(str);
	for(i=0;i<lenstr;i++){
		a=str[i];
		if((a>='a'&&a<='z')||(a>='A'&&a<='Z')||(a==' ')||(a=='.'))
            	brr[n++]=a;
	}
	printf("%s\n", brr);
	lenbrr=strlen(brr);
	for(i=lenbrr-1;i>=0;i--){
		printf("%c", brr[i]);
	}
	return 0;
}

3.构造 N×N

(经典题,太爱了)构造 N×N 阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字 1 到 N 只出现一次。

如 N=4 时:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

解决方法:

//就先存储数据,保证来源
//根据第几行从数组第几个开始
//过头的就用%取余
#include<stdio.h>
#include <string.h>
int main(){
	int n,i,j,num=0;
	scanf("%d",&n);
	int arr[n];
	for(i=0;i<n;i++){
		arr[i]=i+1;
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%d ",arr[(j+num)%(n)]);	
		}
		num++;
		printf("\n");
	}
	return 0;
}

2018 914c程序试卷B卷

1.逆序数(经典)

【问题描述】给定一个整数(正整数、负整数、零),请输出它的逆序数。

【样例输入】
-12300
【样例输出】
 -321

解决方法:

#include<stdio.h>   
int main(){
  int n;
  scanf("%d",&n);
  if(n<0){
    printf("%c",'-');
    n=-n;
  }else if(n==0){  
    printf("%d",0);
    return 0;
  }
  while(n>0){
    if(n%10==0){
      n=n/10;
      printf("%d",0);
    }else {
      printf("%d",n%10);
      n=n/10;
    }
  }
  return 0;   
}

2.统计单词个数

【问题描述】统计一个英文句子(长度不大于80)中含有英文单词的个数,单词之间用空格隔开。

【样例输入】
Hello World!
【样例输出】
num=2

解决方法:

#include<stdio.h>
#include<string.h>
int main(){
	int num=0,lenstr,i;
	char str[80];
	fgets(str, 80, stdin);
	lenstr=strlen(str);
	for(i=0;i<lenstr;i++){
		if(str[i]==' ')
			num++;
	}
	printf("num=%d",num+1);
}

3.三位数加法

【问题描述】两组三位整数数据链表,用结构体ListNode表示,每个节点只放一位数字:
struct ListNode {
int val;
struct ListNode *next;
};
要求建立如下例的链表,并利用链表实现加法运算。
image

【样例输入】
2 4 3 5 6 4
5 6 7 7 8 9
(2->4->3)+(5->6->4)    //说明:表示342+465
(5->6->7)+(7->8->9)
【样例输出】
(7->0->8)
(2->5->7->1)

解决方法:

好消息:我会啦

方法一:把结果在外面算好,再搞进去

#include<stdlib.h>
#include<stdio.h>
int lend(int n);
struct ListNode{
    int val;
    struct ListNode *next;
};
int main(){
    int i;
    int n[6];
    struct ListNode *p,*p1,*p2,*result,*q;
    q=(struct ListNode *)malloc(sizeof(struct ListNode ));
    while(1){
      for(i=0;i<6;i++){
        scanf("%d",&n[i]);
      }
      //链1
      p1=(struct ListNode *)malloc(sizeof(struct ListNode ));
      p1->val=n[0];
      p1->next=NULL;
      q=p1;
      for(i=1;i<3;i++){
        p=(struct ListNode *)malloc(sizeof(struct ListNode ));
        p->val=n[i];//当前的值
        q->next=p;
        p->next=NULL;
        q=p;
      }
      //链2
      p2=(struct ListNode *)malloc(sizeof(struct ListNode ));
      p2->val=n[3];
      p2->next=NULL;
      q=p2;
      for(i=4;i<6;i++){
        p=(struct ListNode *)malloc(sizeof(struct ListNode ));
        p->val=n[i];//当前的值
        q->next=p;
        p->next=NULL;
        q=p;
      }
      // 先循环遍历,把两个链表的结果算出
      int sum1=0,sum2=0;
      p=p1;//p,q工具人
      q=p2;
      int chen=1;
      for(i=0;i<3;i++){
        sum1=sum1+(p->val)*chen;
        sum2=sum2+(q->val)*chen;
        chen=chen*10;
        p=p->next;
        q=q->next;
      }
      sum1=sum1+sum2;
      int len=lend(sum1);
      //result链
      result=(struct ListNode *)malloc(sizeof(struct ListNode ));
      result->val=sum1%10;
      result->next=NULL;
      q=result;
      sum1=sum1/10;
      while(sum1>0){
        p=(struct ListNode *)malloc(sizeof(struct ListNode ));
        p->val=sum1%10;//当前的值
        q->next=p;
        p->next=NULL;
        q=p;
        sum1=sum1/10;
      }
      p=result;
      printf("(");
      for(i=0;i<len;i++){
        if(i==len-1){
          printf("%d)",p->val);
          p=p->next;
        }else{
          printf("%d->",p->val);
          p=p->next;
        }
      }
    }
    return 0;
}
int lend(int n){
  int num=0;
  while(n>0){
    num++;
    n=n/10;
  }
  return num;
}

方法二:全部用链表做

#include<stdlib.h>
#include<stdio.h>
struct ListNode{
    int val;
    struct ListNode *next;
};
int main(){
  int i;
  int n[6];
  struct ListNode *p,*p1,*p2,*result,*q,*temp,*r;
  q=(struct ListNode *)malloc(sizeof(struct ListNode ));
  while(1){
    for(i=0;i<6;i++){
      scanf("%d",&n[i]);
    }
    //链1
    p1=(struct ListNode *)malloc(sizeof(struct ListNode ));
    p1->val=n[0];
    p1->next=NULL;
    q=p1;
    for(i=1;i<4;i++){
      p=(struct ListNode *)malloc(sizeof(struct ListNode ));
      if(i!=3){
        p->val=n[i];//当前的值
      }else {
        p->val=0;
      }
      q->next=p;
      p->next=NULL;
      q=p;
    }
    //链2
    p2=(struct ListNode *)malloc(sizeof(struct ListNode ));
    p2->val=n[3];
    p2->next=NULL;
    q=p2;
    for(i=4;i<7;i++){
      p=(struct ListNode *)malloc(sizeof(struct ListNode ));
      if(i!=6){
        p->val=n[i];//当前的值
      }else {
        p->val=0;
      }
      q->next=p;
      p->next=NULL;
      q=p;
    }
    // p=p1;
    // while(p){
    //   printf("%d",p->val);
    //   p=p->next;
    // }
    // p=p2;
    // while(p){
    //   printf("%d",p->val);
    //   p=p->next;
    // }
    //工具p q r
    r=(struct ListNode *)malloc(sizeof(struct ListNode ));
    p=p1;
    q=p2;
    int flag=0;//进位符
    //result链
    result=(struct ListNode *)malloc(sizeof(struct ListNode ));
    result->next=NULL;
    r=result;
    while(p&&q){
      temp=(struct ListNode *)malloc(sizeof(struct ListNode ));
      temp->val=(p->val+q->val+flag)%10;//当前的值
      // printf("%d %d %d\n",p->val,q->val,temp->val);
      r->next=temp;
      temp->next=NULL;
      r=temp;
      if(p->val+q->val+flag>=10)
        flag=1;
      else
        flag=0;
      p=p->next;
      q=q->next; 
    }
    p=result->next;
    printf("(");
    printf("%d",p->val);
    p=p->next;
    while(p){
      if(p->next==NULL && p->val==0){//第四个数是0
      }else{
        printf("->%d",p->val);
      }
      p=p->next;
    }
    printf(")");
  }
}

2019 917数据结构与程序设计(A卷)

1.质数

根据数论的知识可知,任何一个合数都可以写成几个质数相乘的形式,这几个质数叫做这个合数的质因数。例如:24=2×2×2×3。现在从键盘输入一个正整数n(n<10000),请编程输出它的所有质因数。

输入样例
180
输出样例
2 2 3 3 5

解决方法:

#include <stdio.h>
int main(){
    int n,i; 
    scanf("%d",&n);
	//尽可能的/2,没有2之后在考虑3
  	for(i=2;i<=n;i=i){
	    while (i<=n){
		if (n%i==0) {
		   printf("%d ",i);
		   break;
		}else
		   i=i+1;
          }
    	n=n/i;
    }
	printf("\n");
	return 0;
}

2006年初试题

1.字符串

给定一个字符串数组str[10][100],一个整型数组count[10]。要求从键盘读入10个字符串,并统计每个字符串中包含的单词个数到对应的count数组中。

测试用例:
hello
dog
cat
deer
process
good
morning
hi
math
string
输出结果:
hello:5
dog:3
cat:3
deer:4
process:7
good:4
morning:7
hi:2
math:4
string:6

解决方法:

#include <stdio.h>
#include <string.h>
int main(){
    char str[10][100];
	int count[10];
	int i=0,num;
	for(i=0;i<10;i++){
		scanf("%s",str[i]);
		num=strlen(str[i]);
		count[i]=num;
	}
	for(i=0;i<10;i++){
		printf("%s:%d\n",str[i],count[i]);
	}
	return 0;
}

2012 819初试题

1.字符矩阵


!!!!看错题目了,但是舍不得删代码,新编一个题
给定一个n*4的字符矩阵,每行都有3个字符,最后一个列空间可自由使用,现要求按照列排序,小写字母再大写字母前面。例如下例:

测试用例:
//后面有一个空格哦
4
hel 
abr 
uIN 
uWG 
输出结果:(按列排序)
a b l  
h e r  
u I G  
u W N

解决方法:

#include <stdio.h>
#include <string.h>
char * sortChar(char *s);
int main(){
	int n,i,j,min,minj=0;
	scanf("%d",&n);
	char str[n][4];
	char str1[30];
	char *s;
	for(i=0;i<n;i++){
		scanf("%s",str[i]);
	}
	//对列进行排序
	for(i=0;i<3;i++){
		for(j=0;j<n;j++){
			str1[j]=str[j][i];
		}
		s=sortChar(str1);
		for(j=0;j<n;j++){
			str[j][i]=s[j];
		}
	}
	for(i=0;i<4;i++){
		for(j=0;j<n;j++){
			printf("%c ",str[i][j]);
		}
		printf("\n");
	}
	return 0;
}
char * sortChar(char *a){
	int i,j,n,mix;
	char tempA;
	n=strlen(a);
	for (i = 0; i<n; i++) {
		if(a[i]>='A'&&a[i]<='Z'){
			a[i]=a[i]+32;
		}else if(a[i]>='a'&&a[i]<='z'){
			a[i]=a[i]-32;
		}
    }
	for (i = 0; i < n - 1; i++) {
        mix = i;                            //p用于记录最小元素的下标
        for (int j = i + 1; j < n; j++) {       //找到剩下元素中最小的那一个
            if (a[mix] > a[j])
                mix = j;
        }
        tempA = a[i];                        //temp是交换两数时的中间变量
        a[i] = a[mix];
        a[mix] = tempA;
    }
	for (i = 0; i<n; i++) {
		if(a[i]>='A'&&a[i]<='Z'){
			a[i]=a[i]+32;
		}else if(a[i]>='a'&&a[i]<='z'){
			a[i]=a[i]-32;
		}
    }
	return a;
}

2.字符矩阵

给定一个n*4的字符矩阵,每行都有3个字符,最后一个列空间可自由使用,现要求按行的字符大小从小到大进行排序,当第一列的字符相同时,按第二列字符的大小比较,区分大小写,行内各列字符位置不变。例如下例:

测试用例:
//后面有一个空格哦
4
hel 
abr 
uIN 
uWG 
输出结果:
a b r  
h e l  
u I N  
u W G

image
解决方法:

#include <stdio.h>
#include <string.h>
int main(){
    int n,i,j,min;
	scanf("%d",&n);
	char str[n][4];
	for(i=0;i<n;i++){
		scanf("%s",str[i]);
	}
    char s[100];//不能写成*s.
    for (i=0;i<n-1; i++) {
        min = i;                            
        for (j=i+1;j<n;j++) {       
            if (strcmp(str[min],str[j])>0)//前面一个大
                min = j;
        }
        strcpy(s,str[i]);                        //temp是交换两数时的中间变量
        strcpy(str[i],str[min]);
        strcpy(str[min],s);
    }
    for(i=0;i<n;i++){
		printf("%s\n",str[i]);
	}
	return 0;
}

2013 914初试题

1.菀菀 类 安大题

能有几分似菀菀也是你的福气

已知 y=1-1/3+1/5-1/7+1/9+...,以此类推直到最后一项小于0.0000001为止,请编写完整的程序求出y,要求有完整的输入、计算、输出过程。
解决方法:

#include <stdio.h>
int main(){
	double y=0,num=1;
	int i=0;
	while(num>0.0000001){
		num=(1.0)/(2*i+1);
		if(i%2==0){//为偶数项
			y=y+num;
		}else{
			y=y-num;
		}
		i++;
	}
	printf("%lf",y);
	return 0;
}

2014 914初试题

1.n的阶乘

编写一个函数Fac (int n), 计算n的阶乘,其中10≥n≥0。

输入示例:
4
输出示例:
24

解决方法:

#include <stdio.h>
int Fac(int n);
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",Fac(n));
	return 0;
}
int Fac(int n){
	if(n==0||n==1){
  		return 1;
 	}else
  		return n*Fac(n-1);
 }

2.有strlen函数,我偏不用

不用strlen函数,编写一个函数slength(char *s),用于求字符串s的长度。

输入示例:
hello
输出示例:
5

解决方法:

#include <stdio.h>
#include <stdlib.h>
int slength(char *s);
int main(){
    int len;
    char str[20];
    scanf("%s",str);//读取数据 
    len=slength(str);//求字符串长度 
    printf("%d",len);
    return 0;
}
//求字符串长度  
int slength(char *s){  
    int sum=0;
    while(*s!='\0'){  
        sum++;   
        s++;
    }  
    return sum;
}

3.对单词排序输出

编写一个程序,从键盘上读入10个单词,对这10个单词排序并输出。
说明:排序必须单独用函数实现,在main函数中调用排序函数。

在C语言中,我们可以用“==”来比较两个数或两个字符是否相等。那字符串该如何比较呢,我们一般用strcmp函数来比较,它的头文件为<string.h>。结果>0就是前面的值大,结果<0就是后面的值大。
strcmp(ar2[min],ar2[j])>0
strcpy(s, ar2[i])

输入示例:
a112
b1
c145
d1
f1
e113
e113
t555
re3
fds
输出示例:
a112 b1 c145 d1 e113 e113 f1 fds re3 t555

解决方法:

#include <stdio.h>
#include <string.h>
void sortChar(char ar2[][100]);
int main(void){
    char arr[10][100]={0};
    int i;
    //输入
    for(i=0;i<10;i++){
        scanf("%s",arr[i]);
    }
    //排序
    sortChar(arr);
    //打印
    for(i=0;i<10;i++)
        printf("%s ",arr[i]);
    return 0;
}
void sortChar(char ar2[][100]){//其中函数完成对ar2数组中的n个字符串进行排序。
    int i,j,min;
    char s[100];
	for (i=0; i<9; i++) {
	    min=i;
        for (int j = i + 1; j<10; j++) {       //找到剩下元素中最小的那一个
            if (strcmp(ar2[min],ar2[j])>0)
                min = j;
        }
        strcpy(s, ar2[i]);                        //temp是交换两数时的中间变量
        strcpy(ar2[i],ar2[min]);
        strcpy(ar2[min],s);
    }
}

2015 914C初试题

1.田忌赛马

田忌经常与齐国众公子赛马,设重金赌注。孙膑对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和诸公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,拿您的上等马对付他们的中等马,拿您的中等马对付他们的下等马。”田忌一场败而两场胜,最终赢得齐王的千金赌注。我们分别用 A, B, C 表示田忌的上等马,中等马,下等马,用 0, 1, 2 表示对手的上等马,中等马,下等马。请根据对手的出场顺序确定田忌方的出场顺序。注意:仅需要输入两个整数就够了,它们代表前两匹马,第三匹马自然被确定了。

(妈妈夸我小天才) 0->C 1->A 2->B 怎么确定最后一个数呢?三个数想加结果为3,还是三个不一样的数,还确定了两个。
3-a-b=第三个数

Sample Input:
1 0
Sample Output 
A C B

解决方法:

#include <stdio.h>
char print1(int a);
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%c %c %c",print1(a),print1(b),print1(3-a-b));
    return 0;
}
char print1(int a){
    switch (a) {
    case 0:
        return 'C';
    case 1:
        return 'A';
    case 2:
        return 'B';
    }
    return ' ';
}

2.复数计算

复数可表示成 a+bi,其中 a,b 都是实数, ii = -1。现有 N 个复数,请计算它们的乘积。输入复数的个数 N 及每个复数,输出它们的乘积。保留两位小数。提示:(a+bi)(c+di)=(ac-bd)+(bc+ad)i

Sample Input
2
0.5 1
1 -0.5
Sample Output
1.00 0.75

解决方法:

#include <stdio.h>
void fushu(double *a,double *b,int i);
int main(){
    int n,i;
    scanf("%d",&n);
    double a[n],b[n];
    for(i=0;i<n;i++){
        scanf("%lf",&a[i]);
        scanf("%lf",&b[i]);
    }
    for(i=0;i<n-1;i++){//将两组处理完结果存到第二组,再第二组与第三组
        fushu(a,b,i);
    }
        printf("%.2f %.2f",a[i],b[i]);
    return 0;
}
void fushu(double *a,double *b,int i){
    double a1,b1;
    a1= a[i]*a[i+1]-b[i]*b[i+1];
    b1= a[i+1]*b[i]+a[i]*b[i+1];
    a[i+1]=a1;
    b[i+1]=b1;
}

3.求平均幸福指数

在某小区,举行幸福指数投票。假设有 N(3<=N<=50)个人参与了投票,去掉一个最高分和一个最低分,剩余的分数取平均值可作为该小区的平均幸福指数。输入投票人数及投票分数,输出平均幸福指数。结果保留两位小数。

Sample Input
4
8.0
7.1
7.5
6.9
Sample Output
7.30

解决方法:

#include <stdio.h>
int main(void){
    int n,i;
    scanf("%d",&n);
    int maxi=0,mini=0;
    double love[n];
    double sum=0;
    for(i=0;i<n;i++){
        scanf("%lf",&love[i]);
        if(love[mini]>love[i])
            mini=i;
        else if(love[maxi]<love[i])
            maxi=i;
        sum=sum+love[i];
    }
    sum=sum-love[maxi]-love[mini];
    printf("%.2f",sum/(n-2));
    return 0;
}

2016 914C初试题

1、这门课程的总评成绩

【问题描述】
你这学期计算机应用基础课程的总评成绩=10%平时+40%上机实验+50%期末卷面考试;成绩由优、良、中、及格、不及格五个等级来表示,其中:
总评成绩>=90,优
90>总评成绩>=80,良
80>总评成绩>=70,中
70>总评成绩>=60,及格
其他,不及格
【输入】
输入一个学生的平时成绩、上机实验成绩、期末卷面成绩(整型);
【输出】
请你输出该学生的成绩等级。

【样例输入】
 80 90 85
【样例输出】
 良

解决方法:

#include <stdio.h>
char *grade(int a);
int main(){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    double gra;
    gra=0.1*a+0.4*b+0.5*c;
    printf("%s",grade(gra));
    return 0;
}
char *grade(int a){
    switch (a/10) {
    case 9:
        return "优";
    case 8:
        return "良"; 
    case 7:
        return "中";
    case 6:
        return "及格";
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
        return "不及格";
    }
    return " ";
}

2、根据年龄计算生肖。

【问题描述】
在东南亚的很多国家,都有十二生肖的说法。以中国为例,2000 年为龙年(Dragon),接下来依次是蛇(Snake),马(Horse),羊(Sheep),猴(Monkey),鸡(Cock),狗(Dog),猪(Boar),鼠(Rat),牛(Ox),虎(Tiger),兔(Hare)。今年是 2015 年,请根据用户输入的年龄,输出他(她)的生肖。
【输入】
第一行的数字为测试数据的组数 N,接下来是 N 个人的年龄。
【输出】
相应的生肖。

【样例输入】
2
14
109
【样例输出】
Snake
Horse

解决方法:
可能复杂了,根据年龄算出出生年份,然后根据年份算生效,生肖这个我真不会😅😅😅

#include <stdio.h>
char *bir(int year);
int biryear(int a);
char *print1(int year);
int main(){
    int n,a,i,year;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a);
        year =biryear(a);
        printf("%s",print1(year));
    }
    return 0;
}
//计算出生年份
int biryear(int a){
    if(a>=15)
        a=2015-a;
    else
        a=2000-(a-15);
    return a;
}
//输出生肖
char *bir(int year){
    switch (year) {
    case 0:
        return "Rat";
    case 1:
        return "Ox"; 
    case 2:
        return "Tiger";
    case 3:
        return "Hare";
    case 4:
        return "Dragon";
    case 5:
        return "Snake";
    case 6:
        return "Horse";
    case 7:
        return "Sheep";
    case 8:
        return "Monkey";
    case 9:
        return "Cock";
    case 10:
        return "Dog"; 
    case 11:
        return "Boar";
    }
    return " ";
}
//根据年份判别生效
char *print1(int year){
    if(year == 1900){
        return "rat";
    }
    if(year > 1900){
        year = year - 1900;
        year = year % 12;
        return bir(year);
    }
    if(year < 1900){
        year = (year - 1900) * -1;
        year = year % 12;
        year = 12 - year;
        return bir(year);
    }
    return " ";
}

3、各位数字和。

【问题描述】
小明今年 4 岁了,正读幼儿园小班呢。老师为了测试孩子对加法的掌握程度,在黑板上随手写了一些数字,让孩子们把各个位上的数字加一起,看看答案正确与否。
【输入】
第一行的数字为测试数据的组数 N,接下来每行有两个数字,前面的数字代表老师写下的整数,后面的数字代表孩子运算的结果。
【输出】
如果正确输入 Right, 如果错误输出 Wrong。

【样例输入】
2
123 6
7890 20
【样例输出】
Right
Wrong

解决方法:

#include <stdio.h>
int func(int a);
int main(){
    int n,i;
    scanf("%d",&n);
    int a,b;
    for(i=0;i<n;i++){
        scanf("%d%d",&a,&b);
        if(func(a)==b)
            printf("%s","Right");
        else
            printf("%s","Wrong");
    }
    return 0;
}
int func(int a){
    int sum=0;
    while(a>0){
        sum=sum+a%10;
        a=a/10;
    }
    return sum;
}
posted @ 2023-03-19 21:58  太好了还有脑子可以用  阅读(52)  评论(0编辑  收藏  举报