C语言笔试题整理2

1、C-阿里巴巴找黄金宝箱(III)-一贫如洗的樵夫阿里巴巴在去砍柴的路上

题目描述:

一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从 0~N 的箱子,每个箱子上面贴有一个数字。

阿里巴巴念出一个咒语数字,查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱子的编号之差的绝对值小于等于咒语数字,
如果存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1。

输入描述:

第一行输入一个数字字串,数字之间使用逗号分隔,例如: 1,2,3,1 字串中数字个数>=1,<=100000;每个数字值>=-100000,<=100000;

第二行输入咒语数字,例如:3,咒语数字>=1,<=100000

输出描述:

存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1
补充说明:
在这里插入图片描述

题解思路

#include <stdio.h>
#include <stdlib.h>

int main() 
{
   
	setbuf(stdout, NULL);
	int nums[100000] = {
   0};
	int len = 0;
	do {
   
		scanf("%d", &nums[len++]);
	} while (getchar() != '\n');
	
	int val;
	scanf("%d", &val);
	
	int left = 0, right = 1;
	while (left < len)
	{
   
		if (nums[left] != nums[right] && right -left <= val) 
		{
   
			right++;
		} 
		else if (nums[left] == nums[right] && right -left <= val)
		 {
   
			printf("%d ", left);
			return 0;
		} 
		else 
		{
   
			left++, right = left + 1;
		}
}
	printf("-1");
	return 0;
}

相关代码解析

程序输出有两种方式:一种是即时处理方式,另一种是先暂存起来,然后再大块写入的方式,前者往往造成较高的系统负担。因此,c语言实现通常都允许程序员进行实际的写操作之前控制产生的输出数据量。

这种控制能力一般是通过库函数setbuf实现的。如果buf是一个大小适当的字符数组,那么:

setbuf(stdout,buf);

语句将通知输入/输出库,所有写入到stdout的输出都应该使用buf作为输出缓冲区,直到buf缓冲区被填满或者程序员直接调用fflush(译注:对于由写操作打开的文件,调用fflush将导致输出缓冲区的内容被实际地写入该文件),buf缓冲区中的内容才实际写入到stdout中。缓冲区的大小由系统头文件<stdio.h>中的BUFSIZ定义。

举例说明如下(代码通过VS2008编译)

#include <iostream>
#include<fstream>

int main(int argc, char* argv[])
{
   
    char* outbuf =  new char [100];
    setbuf(stdout,outbuf);//将输出流绑定到outbuf上
    puts("helloworld\n");//内容输入到outbuf内
    //setbuf(stdout,NULL);//如果启用这行代码,输出流恢复原来的状态,puts输出到控制台
    delete[] outbuf;
    system("pause");
    return 0;

}

————————————————
版权声明:本文为CSDN博主「王教余」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangjiaoyu250/article/details/8629136

2、C-判断字符串子序列

题目描述:

给定字符串 target 和 source, 判断 target 是否为 source 的子序列。
你可以认为 target 和 source 中仅包含英文小写字母。字符串 source 可能会很长(长度 ~= 500,000),而 target 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位
置形成的新字符串。(例如,"abc"是"aebycd"的一个子序列,而"ayb"不是)。
请找出最后一个子序列的起始位置。

输入描述:

第一行为 target,短字符串(长度 <=100)
第二行为 source,长字符串(长度 ~= 500,000)

输出描述:

最后一个子序列的起始位置, 即最后一个子序列首字母的下标

补充说明:

若在 source 中找不到 target,则输出-1

示例 1

输入:
abc
abcaybec
输出:
3

说明:

这里有两个 abc 的子序列满足,取下标较大的,故返回 3

#include <stdio.h>
#include <string.h>
int main()
{
   
	int a = 0;
	int b = 0;
	int c,d;
	
	char chang[500001];
	char duan[101];
	
	scanf("%s",duan);
	scanf("%s",chang);
	c = strlen(chang);
	d = strlen(duan);
	c=c-1;
	d=d-1;
	if(c<d)
	{
   
		printf("-1");
		return 0;
	}
	if(d==0)
	{
   
		printf("%d",c);
		return 0;
	}
	while(c!=-1)
	{
   
		if(chang[c]==duan[d])
		{
   
			if(d == 0)
			{
   
				printf("%d",c);
				return 0;
			}
			else
			{
   
				c--;
				d--;
			}
	}
	else
	{
   
		c--;
	}
}
	printf("-1");
	return 0;
}

3、给定非空字符串 s,将该字符串分割成一些子串,使每个子串的 ASCII 码值的和均为水仙花数。

1、若分割不成功,则返回 0
2、若分割成功且分割结果不唯一,则返回-1
3、若分割成功且分割结果唯一,则返回分割后子串的数目

输入描述:

1、输入字符串的最大长度为 200
输出描述:
根据题目描述中情况,返回相应的结果

补充说明:

“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如 371 是“水仙花数”,
因为:371 = 3^3 + 7^3 + 1^3

示例 1

输入:
abc
输出:
0
说明:
分割不成功

示例 2

输入:
f3@d5a8
输出:
-1
说明:
分割成功但分割结果不唯一,可以分割为两组,一组"f3"和"@d5a8",另外一组"f3@d5" 和"a8" 示例 3
输入:
AXdddF
输出:
2
说明:
成功分割且分割结果唯一,可以分割“AX"(153)和"dddF"(370)成两个子串

#include <stdio.h>
#include <string.h>

int resCnt = 0;
int resVal = 0;
int resVal1 = 0;
int check(const char *p, int len, int begin, int end) 
{
   
	int t = 0;
	for (int i = begin; i <= end; i++) 
	{
   
		t += p[i];
	}
	return t == 370 || t == 153 || t == 407 || t == 371;
}

void test(const char *p, int len, int pos) 
{
   
	if (pos == len) 
	{
   
		++resCnt;
		resVal = resVal1;
		return;
	}
	for (int i = pos; i < len; i++) 
	{
   
		if (check(p, len, pos, i)) 
		{
   
			++resVal1;
			test(p, len, i + 1);
			resVal1--;
		}
	}
}

int main() 
{
   
	char str[256] = {
    0 };
	scanf("%s", str);
	test(str, strlen(str), 0);
	if (resCnt == 0) 
	{
   
		printf("0\n");
	}
	else if (resCnt > 1) 
	{
   
		printf("-1\n");
	}
	else 
	{
   
		printf("%d\n", resVal);
	}
	return 0;
}

4、勾股数元组题目描述:

如果 3 个正整数(a,b,c)满足 aa + bb = c*c的关系,则称(a,b,c)为勾股数(著名的勾三股四
弦五),为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即 a 与 b,a
与 c,b 与 c 之间均互质,没有公约数),则其为勾股数元祖(例如(3,4,5)是勾股数元祖,
(6,8,10)则不是勾股数元祖)。请求出给定范围[N,M]内,所有的勾股数元祖。

输入描述:

起始范围 N,1 <= N <= 10000
结束范围 M,N < M <= 10000

输出描述:

  1. a,b,c 请保证 a < b < c,输出格式:a b c;
  2. 多组勾股数元祖请按照 a 升序,b 升序,最后 c 升序的方式排序输出;
  3. 给定范围中如果找不到勾股数元祖时,输出”NA”。

题目描述:

如果 3 个正整数(a,b,c)满足 aa + bb = c*c的关系,则称(a,b,c)为勾股数(著名的勾三股四
弦五),为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即 a 与 b,a
与 c,b 与 c 之间均互质,没有公约数),则其为勾股数元祖(例如(3,4,5)是勾股数元祖,
(6,8,10)则不是勾股数元祖)。请求出给定范围[N,M]内,所有的勾股数元祖。
输入描述:
起始范围 N,1 <= N <= 10000
结束范围 M,N < M <= 10000
输出描述:

  1. a,b,c 请保证 a < b < c,输出格式:a b c;
  2. 多组勾股数元祖请按照 a 升序,b 升序,最后 c 升序的方式排序输出;
  3. 给定范围中如果找不到勾股数元祖时,输出”NA”。
#include <stdio.h>
#include <math.h>
int sign = 0;

int checkgcd(int n,int m)
{
   
	if (n==0||m==0) 
	{
   
		return 1;
	}
	if (n%m==0) 
	{
   
		return m;
	}
	else 
	{
   
		return checkgcd(m, n%m);
	}
}

int getgougushu(int n,int m)
{
   
	int i,j,k;
	double temp;
	long cz;
	for (i=n; i<=m; i++) 
	{
   
		for (j=i+1; j<=m; j++) 
		{
   
			k=i*i+j*j;
			temp=sqrt(k);
			cz=(long)temp;
			if (cz-temp!=0) 
			{
   
				continue;
			}
			k=(int)temp;
			if(k<=m&&checkgcd(i,j)==1&&checkgcd(i,k)==1&&checkgcd(j,k)==1) 
			{
   
				printf("%d %d %d\n",i,j,k);
				sign=1;
			}
		}
	}
	return 0;
}

int main() 
{
   
	int m, n;
	scanf("%d %d", &n, &m);
	getgougushu(n,m);
	if (sign==0) 
	{
   
		printf("NA\n");
	}
	return 0;
}

5、C-观看文艺汇演问题

题目描述:

为庆祝中国共产党成立 100 周年,某公园将举行多场文艺汇演,很多演出都是同时进行。
一个人只能同时观看一场演出,且不能迟到早退。由于演出分散在不同的演出场地,所以连
续观看的演出最少要有 15 分钟的时间间隔。
小明是一个狂热的文艺迷,想观看尽可能多的演出。现给出演出时间表,请帮小明计算他最
多能观看几场演出。

输入描述:

第一行为一个数 N,表示演出场数,1<=N<=1000
接下来 N 行,每行两个空格分隔的整数,第一个整数 T 表示演出开始时间,第二个整数 L
表示演出持续时间。T 和 L 的单位都是分钟,0<=T<=1440,0<L<=180

输出描述:

请输出最多能观看的演出场数

补充说明:

示例 1

输入:
2
720 120
840 120
输出:
1

说明:

两场演出间隔时间为 0,不满足最小 15 分钟时间间隔的要求,所以最多只能观看一场演出

示例 2

输入:
2
0 60
90 60
输出:
2

说明:

两场演出间隔大于 15 分钟,都能观看到
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct time{
   
int fr,end;
}timer;
timer arr[1010];

int cmp(const void *a,const void *b)
{
   
	timer *x = (timer*)a;
	timer *y = (timer*)b;
	if(x->end!= y->end)
	{
   
		return x->end - y->end;
	}
	return x->fr - y->fr;
}

int main() 
{
   
	int n;
	scanf("%d",&n);
	for(int i = 0;i< n;i++)
	{
   
		scanf("%d%d",&arr[i].fr,&arr[i].end);
		arr[i].end+=arr[i].fr;
	}
	qsort(arr,n,sizeof(timer),cmp);
	
	int sum = 0;
	int last = -15;
	for(int i = 0;i< n;i++)
	{
   
		if(arr[i].fr-last>=15)
		{
   
			sum++;
			last = arr[i].end;
		}
	}
	printf("%d",sum);
	return 0;
}

6、C-最长方连续方波信号

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <string.h>

int main() 
{
   
	int c;
	int max = 0;
	char data[1025];
	scanf("%s",data);
	c = strlen(data);
	
	int i = 0;
	int j = 0;
	int flag = 0;
	int h = 0;
	int num = 0;
	int search(char data[],int i,int flag,int h);
	for(j=0;j<c;j++)
	{
   
		num=search(data,j,flag,h);
		if(num>=3&&num>max)
		{
   
			max = num;
		}
		flag = 0;
	}
	if(max == 0)
	{
   
		printf("-1");
		return 0;
	}
	else 
	{
   
		for(j=0;j<max;j++)
		{
   
			if(j%2 == 0)
			{
   
				printf("0");
			}
			else 
			{
   
				printf("1");
			}
		}
	}
	return 0;
}

int search(char data[],int i,int flag,int h)
{
   
	if(flag == 0)
	{
   
		if(data[i] =='0')
		{
   
			i++;
			h++;
			flag = 1;
			h=search(data, i,flag,h);
		}
		else 
		{
   
			h = 0;
			return h;
		}
	}
	else 
	{
   
		if(data[i] =='1')
		{
   
			i++;
			h++;
			flag = 0;
			h=search(data, i,flag,h);
		}
	else 
	{
   
		return h;
	}	
}
	return h;
}

7、矩形相交的面积

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main() 
{
   
	int matrix[3][4];
	int i,j;
	for (i=0; i<3; i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值