C&C++刷题练习
蓝桥杯[错误的票据]
题目:
某涉密单位下发了某种票据,并要在年终全部收回每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个 ID断号,另外一个ID 重号。你的任务是通过编程,找出断号的ID和重号的ID假设断号不可能发生在最大和最小号
输入描述:
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于10^5)
输出描述:
要求程序输出1行,含两个整数 m,n,用空格分隔。
其中,m 表示断号ID,n 表示重号ID
输入输出样例示:
输入#
2 5 6 8 11 9 10 12 9
输出#
7 9
解法一:C++的解法 #
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> arr; //开辟动态数组
int N; //设置变量N表示后面数据函数
cin >> N;
for (int i = 0; i < N; i++)
{
int k = 0;
while (cin >> k)
{
arr.push_back(k); //vector的尾插
if (cin.get() == '\n') //当接受到回车键时,就退出当前循环
{
break;
}
}
}
sort(arr.begin(), arr.end()); //快速排序
int m, n;
for (int i = 0; i < arr.size(); i++)
{
if ((arr[i + 1] - arr[i]) > 1) //如果前后两个数据>1则出现断号
{
m = arr[i + 1] - 1;
}
if(arr[i+1] == arr[i])
{
n = arr[i];
}
}
cout << m << " " << n;
return 0;
}
解法二:C的解法#
#include<stdio.h>
#include<stdlib.h>
int main()
{
int N, arr[20000] = { 0 }, m, n, i = 0;
scanf("%d", &N);
while (N--)
{
while (scanf("%d", &arr[i])>0)
{
i++;
if(getchar() == '\n')
{
break;
}
}
}
int PaiXu(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
int rs = sizeof(arr) / sizeof(arr[0]);
qsort(arr,rs, sizeof(int), PaiXu);//快速排序
for (int i = 1; i < rs; i++)
{
if((arr[i]-arr[i-1])>1)
{
m = arr[i]-1;
}
else if((arr[i]-arr[i-1]) == 0)
{
n = arr[i];
}
}
printf("%d %d", m, n);
return 0;
}
蓝桥杯[X图形]
题目:
给定一个字母矩阵。一个X图形由中心点和由中心点向四个 45 度斜线方向引出的直线段组成,四条线段的长度相同,而且四条线段上的字母和中心点的字母相同。
一个X图形可以使用三个整数 r,c,L来描述,其中 r,c 表示中心点位于第r行第c列,正整数L表示引出的直线段的长度。对于1到L之间的每个整数i,X图形满足:第 r-i 行第 c-i 列与第r行第c列相同,第 r-i 行第 c+i 列与第r行第c列相同,第 r+i 行第 c-i 列与第r行第c列相同,第 r+i 行第 c+i 列与第r 行第c列相同。
例如:对于下面的字母矩阵中,所有的字母组成一个X图形,中间的5个L也组成一个X图形。所有字母Q组成了一个X图形。
给定一个字母矩阵,请求其中有多少个X图形 ?
输入格式:
输入第一行包含两个整数n,m,分别表示字母矩阵的行数和列数。
接下来n行,每行m个大写字母,为给定的矩阵。
输出格式:
输出一行,包含一个整数,表示答案。
样例输入#
5 6 LAAALA ALQLQA AALQAA ALQLQA LAAALA
样例输出#
3
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n = 0,m = 0,count = 0;
cin>>n>>m;
char arr[101][101] = {0};
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>arr[i][j];
}
}
for(int i = 1;i<n-1;i++)
{
for(int j = 1;j<m-1;j++)
{
char k = arr[i][j];
int l = 1;
while((k == arr[i-l][j-l])&&(k == arr[i-l][j+l])&&(k == arr[i+l][j-l])&&(k == arr[i+l][j+l]))
{
count++;
l++;
}
}
}
cout<<count;
return 0;
}
蓝桥杯[核桃的数量]?
题目:
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1各组的核桃数量必须相同
2.各组内必须能平分核桃(当然是不能打碎的)
3尽量提供满足12条件的最小数量(节约闹革命嘛)
输入描述:
输入一行a,b,c,都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c < 30)。
输出描述:
输出一个正整数,表示每袋核桃的数量。?
输入输出样例
输入#
2 4 5
输出#
20
解法一:C++的解法#
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[3] = { 0 },num = 0;
for (int i = 1; i <= 3; i++)
{
cin >> a[i];
}
int max = *max_element(a, a + 3);//求出三组中的最大值
for (int i = 1;; i++) //因为我们也不知道要进行多少次,所以不设置循环条件
{
num = max * i; //求最大组的倍数
//判断是否满足平分的条件
if ((num % a[1] == 0) && (num % a[2] == 0) && (num % a[3] == 0))
{
break;
}
}
cout << num;
return 0;
}
解法二:C的解法#
#include <stdio.h>
int main()
{
int a[3] = { 0 },num = 0,max = 0;
for (int i = 1; i <= 3; i++)
{
scanf("%d",&a[i]);
if(a[i]>max)
{
max = a[i];
}
}
for (int i = 1;; i++)
{
num = max * i;
if ((num % a[1] == 0) && (num % a[2] == 0) && (num % a[3] == 0))
{
break;
}
}
printf("%d",num);
return 0;
}
蓝桥杯[最大距离]
题目描述:
在数列a1,a2,···,an中,定义两个元素ai和aj的距离为| i - j |+| ai - aj |,即元素下标的距离加上元素值的差的绝对值,其中| x |表示x的绝对值。
给定一个数列,请问找出元素之间最大的元素距离。
输入描述:
输入的第一行包含一个整数n。
第二行包含n个整数a1,a2,···,an,相邻的整数间用空格分隔,表示给定的数列。
其中,2<=n<=1000,0<=数列中的数 <=10^4。
输出描述:
输出一行包含一个整数,表示答案
输入输出样例:
输入#
5 9 4 2 4 7
输出#
9
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,str[1000] = {0},max = 0;
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>str[i];
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(abs(i-j)+abs(str[i]-str[j])>max) //abs绝对值的函数
max=abs(i-j)+abs(str[i]-str[j]);
}
}
cout<<max;
return 0;
}
蓝桥杯[特殊年份]
问题描述:
今年是2021年,2021这个数字非常特殊它的千位和十位相等,个位比百位大1,我们称满足这样条件的年份为特殊年份。
输入5个年份请计算这里面有多少个特殊年份。
输入格式:
输入 5 行,每行一个4位十进制数(数值范围为1000至9999),表示一个年份。
输出格式:
输出一个整数表示输入的5个年份中有多少个特殊年份。
样例输入#
2019 2021 1920 2120 9899
样例输出#
2
样例说明:
2021 和 9899 是特殊年份,其它不是特殊年份。
解法一:C++的解法#?
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> str;
int count = 0;
for(int i = 0;i<5;i++)
{
int b = 0;
cin>>b;
str.push_back(b);
}
for(int i = 0;i<5;i++)
{
int g=str[i]%10;
int s=str[i]/10%10;
int b=str[i]/100%10;
int q=str[i]/1000;
if((g == b+1)&&(q == s))
{
count++;
}
}
cout<<count;
return 0;
}
?解法二:C的解法#
#include <stdio.h>
int main()
{
int str[5] = {0};
int count = 0;
for(int i = 0;i<5;i++)
{
scanf("%d",&str[i]);
}
for(int i = 0;i<5;i++)
{
int g=str[i]%10;
int s=str[i]/10%10;
int b=str[i]/100%10;
int q=str[i]/1000;
if((g == b+1)&&(q == s))
{
count++;
}
}
printf("%d",count);
return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!