第一次机考复盘

1.质数统计
//一点想法
当时不知道怎么循环着输出多行数字
最近偶然知道的一个方法,打算以后都用:while(a–){ }
题目
现有若干行正整数,请你写一段程序分别统计每一行中有多少个质数。
输入格式:
第一行为一个整数n(0<n<10),代表测试用例行数。后边是n行,每行为若干个用空格分隔的正整数。这些正整数的最后是-1,表示此行结束。
输出格式:
为n行,每行一个整数,对应于输入的每一行中质数的个数。
测试用例保证输入合法,且所有整数可以用int存储
输入样例:

2
37 54 18 92 39 45 8 84 75 15 33 83 85 54 81 33 89 -1
17 19 60 77 2 92 38 63 92 69 91 94 11 -1

输出样例:

3
4

答案:

#include<stdio.h>
int isprime(int a);
int main()
{
    int n=0;
    scanf("%d",&n);
    while(n--){
        int a=0;
        int i=0;
        while(a!=-1){
            scanf("%d",&a);
            if (isprime(a)==1&&a!=-1)
            i++;
        }
        printf("%d\n",i);//就可以直接输入下一行数据啦
    }
}
int isprime(int a)
{
    //int n=0;
    //scanf("%d",&n);
    int isprime=1;
    int k=0;
    for(int i=2;i<=a/2;i++){
        if (a%i==0){
            k++;
        }
    }
    if(k!=0){
        isprime=0;
    }
    //else
    //printf("%d是素数",n);
    //return 0;
    return isprime;
}

2.数字位数
//一点想法
天哪,我也是才知道这么简单
我当时是在想,先输出这个整数数列,再统计这个整数数列的位数,就像经典题型中输出正整数个数的那个方法,想偏了啊啊啊,这么简单的题目
其实知道n和位数的关系就可以直接用分支结构得出结果了。
题目
有一个整数数列,第1项为1,第2项为12,第3项为123,第4项为1234,依此类推,有第10项为12345678910,第15项为123456789101112131415 等等。现请你写一段程序计算该数列第n项的位数。
输入格式:
只有一个整数 n (1<=n<=10000000)。
输出格式:
只有一个整数,为该数列第n项的位数。
测试用例保证输入合法。
输入样例:
15
输出样例:
21
答案:

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

3.谁是凶手
//一点想法
答案不是自己写的,是一个满分答案,但是好像有点长,看起来不是很优化的样子,但是方法好妙,反正我是想不到

//学到的一点东西
1.if(…) {…return 0;}可以结束程序
2.写在代码中了

题目
某处发生了一起凶杀案,警察共抓到了5名嫌疑人,但不能确定他们谁是凶手。于是,警察对他们5个人分别进行了审问。假设这5名嫌疑人分别为5号,6号,7号,8号和9号,审问结果为:5号说8号是凶手,6号说7号是凶手,7号说9号不是凶手,8号说6号不是凶手,9号说7号是凶手。现在警察知道凶手只有一个且一定在这5人当中。后证实他们中有3个人说了实话(也就是说另两个人说了假话)。现请你写一段程序来找出谁是凶手。
输入格式:
第一行为一个整数 n (0<=n<=5),代表说了实话的人数,第2-6行每行均为两个由空格分隔的整数,代表5名嫌疑人的口供。其中前边的整数代表嫌疑人所说的号码,后边的整数代表他说的这个号码是否为凶手(1代表是凶手,0代表不是凶手)。比如输入样例给出的数据就是我们前边所说的情况。
输出格式:
只有一个整数,为凶手的号码。
测试用例保证输入合法。
输入样例:
3
8 1
7 1
9 0
6 0
7 1
输出样例:
8
答案:

#include<stdio.h>
int n,a,b,c,d,e,cnt=0;
int aa=0,bb=0,cc=0,dd=0,ee=0;
main()
{
	scanf("%d",&n);
	scanf("%d%d%d%d%d%d%d%d%d%d",&a,&aa,&b,&bb,&c,&cc,&d,&dd,&e,&ee);
	cnt=0;
	if(a==5&&aa==1) cnt++;
	if(a!=5&&aa==0) cnt++;
	if(b==5&&bb==1) cnt++;
	if(b!=5&&bb==0) cnt++;
	if(c==5&&cc==1) cnt++;
	if(c!=5&&cc==0) cnt++;
	if(d==5&&dd==1) cnt++;
	if(d!=5&&dd==0) cnt++;
	if(e==5&&ee==1) cnt++;
	if(e!=5&&ee==0) cnt++;
	if(cnt==n) {printf("5"); return 0;}
	cnt=0;
	if(a==6&&aa==1) cnt++;
	if(a!=6&&aa==0) cnt++;
	if(b==6&&bb==1) cnt++;
	if(b!=6&&bb==0) cnt++;
	if(c==6&&cc==1) cnt++;
	if(c!=6&&cc==0) cnt++;
	if(d==6&&dd==1) cnt++;
	if(d!=6&&dd==0) cnt++;
	if(e==6&&ee==1) cnt++;
	if(e!=6&&ee==0) cnt++;
	if(cnt==n) {printf("6"); return 0;}
	cnt=0;
	if(a==7&&aa==1) cnt++;
	if(a!=7&&aa==0) cnt++;
	if(b==7&&bb==1) cnt++;
	if(b!=7&&bb==0) cnt++;
	if(c==7&&cc==1) cnt++;
	if(c!=7&&cc==0) cnt++;
	if(d==7&&dd==1) cnt++;
	if(d!=7&&dd==0) cnt++;
	if(e==7&&ee==1) cnt++;
	if(e!=7&&ee==0) cnt++;
	if(cnt==n) {printf("7"); return 0;}
	
	//以上都没有满足条件,所以开始判断是不是8是凶手
	//cnt又=0了;
	cnt=0;
	if(a==8&&aa==1) cnt++;//5号说8是凶手,cnt+1
	if(a!=8&&aa==0) cnt++;
	if(b==8&&bb==1) cnt++;
	if(b!=8&&bb==0) cnt++;
	if(c==8&&cc==1) cnt++;
	if(c!=8&&cc==0) cnt++;//7号说9号不是凶手,cnt+1
	if(d==8&&dd==1) cnt++;
	if(d!=8&&dd==0) cnt++;//8号说6号不是凶手,cnt+1
	//cnt==3了,可以直接输出8并结束程序
	if(e==8&&ee==1) cnt++;
	if(e!=8&&ee==0) cnt++;
	if(cnt==n) {printf("8"); return 0;}
//在8是凶手而且只有3个人说实话的情况下
//别人说出8是凶手以及5 6 7 9不是凶手的可能只能够5选3
//另外还有的可能就是别人说假话,8 不是凶手 以及 5 6 7 9是凶手
//将它们一一列举出来,遇到其中三种情况就可以确定了

	cnt=0;
	if(a==9&&aa==1) cnt++;
	if(a!=9&&aa==0) cnt++;
	if(b==9&&bb==1) cnt++;
	if(b!=9&&bb==0) cnt++;
	if(c==9&&cc==1) cnt++;
	if(c!=9&&cc==0) cnt++;
	if(d==9&&dd==1) cnt++;
	if(d!=9&&dd==0) cnt++;
	if(e==9&&ee==1) cnt++;
	if(e!=9&&ee==0) cnt++;
	if(cnt==n) {printf("9"); return 0;}
}

4.两张牌比大小
//一点想法
没有写出来的题目,下面的答案依然是一个满分答案
//学到的一点东西
1.a和b交换值的大小,避免重复的表达某个人赢
2.当有字母来代表某个数字时(如用T来代表10),可用以下方法:
char a1;
int a;
if(a1==‘T’)
a=10;
else
a=a1-‘0’;

题目
现在有一种牌的玩法如下:共36张牌,牌点为2-10,每样4张。两个人玩,每人从所有牌中取两张,然后比较大小,大的方获胜。

比较大小规则如下。 1、两张牌的总牌点值为两张牌的各自牌点值相加后除以10的余数,如一张5一张6,则总牌点为1; 2、比较大小时,比较的是总牌点儿。也就是说总牌点大的一方获胜; 3、当总牌点相等时,则看牌点最大的单张,牌点大的获胜。如一张3一张6胜过一张4一张5; 4、如果两张牌的牌点相等(对子),则不计总牌点,它们一定胜过所有非对子的组合; 5、对子和对子比较,按单张牌点比大小,如对8胜过对7。 6、如果两个人的牌完全一样,则是平局。

现请你写一段程序来判断两个玩家的胜负。
输入格式:
只有一行,为4个字符,前两个代表A的牌,后两个代表B的牌(字符’T’,代表10)。

输出格式:
只有一行,先输出获胜者(两人的牌完全一样时,按A胜输出),然后是一个冒号,最后是牌面(如果是对子,则输出代表单张牌的字符,否则输出总牌点数)。

测试用例保证输入合法。

输入样例:

样例一:
3645
样例二:
85T3
样例三
3455

输出样例:

样例一:
A:9
样例二:
B:3
样例三:
B:5

答案:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{ 
	char a1,b1,c1,d1;
	scanf("%c%c%c%c",&a1,&b1,&c1,&d1);
	int a,b,c,d;
	if(a1=='T')
		a=10;
	else
		a=a1-'0';
	if(b1=='T')
		b=10;
	else
		b=b1-'0';
	if(c1=='T')
		c=10;
	else
		c=c1-'0';
	if(d1=='T')
		d=10;
	else
		d=d1-'0';
	
	if(a<b)
	{
		int tmp=a;
		a=b;
		b=tmp;
	}
	if(c<d)
	{
		int tmp=c;
		c=d;
		d=tmp;
	}
	//printf("%d %d %d %d",a,b,c,d);
	int s1,s2;
	s1=(a+b)%10;
	s2=(c+d)%10;
	if(a==b&&c==d)
		{
			if(a>=c)
				if(a==10)printf("A:T");
				else
				printf("A:%d",a);
			else
				if(c==10)printf("B:T");
				else
				printf("B:%d",c);
			
			return 0;	
		}
	else if(a==b)
		{
			if(a==10)printf("A:T");
				else
			printf("A:%d",a);
		}
	else if(c==d)
		{
			if(c==10)printf("B:T");
				else
			printf("B:%d",c);
		}
	else if(s1==s2)
	{
		if(a>=c)
		 printf("A:%d",s1);
		else
		printf("B:%d",s2);
	}
	else
	{
		if(s1>s2)
		printf("A:%d",s1);
		else
		printf("B:%d",s2);	
				
	}
 } 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
一套分布式机考系统的架构设计应该考虑以下几个方面: 1. 功能模块:机考系统包括考试管理、试卷生成、答案评分、数据分析等多个模块,需要根据实际需求进设计。 2. 数据存储:机考系统需要存储大量的考生信息、试卷数据、考试记录等数据,需要选择合适的数据库或分布式存储系统进存储。 3. 分布式计算:机考系统需要支持并发访问和高并发处理,可以使用分布式计算技术,将不同的计算任务分配到不同的节点进处理。 4. 负载均衡:为了保证系统的稳定性和可靠性,需要使用负载均衡技术,将求分配到不同的节点进处理。 5. 安全性:机考系统需要保证考试的安全性,需要使用加密算法对数据进加密和解密,同时需要设置安全防护措施,如防火墙、DDoS 攻击防护等。 6. 可扩展性:机考系统需要考虑未来的扩展需求,需要使用可扩展的架构设计,使得系统可以方便地进扩展和升级。 7. 用户体验:机考系统需要考虑用户的体验,界面设计应该简洁明了,功能操作应该方便易用,同时需要考虑不同用户的设备和网络环境,保证系统的兼容性和可访问性。 总之,分布式机考系统的架构设计需要考虑多个因素,包括功能、性能、安全、可扩展性和用户体验等,需要对不同的需求进权衡和取舍,从而设计出一个高效、稳定、安全、易用的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值