IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【蓝桥杯预备营集结九】软件类 C/C++ 预备试题分析及解答 -> 正文阅读

[C++知识库]【蓝桥杯预备营集结九】软件类 C/C++ 预备试题分析及解答

?🎉🎉?目前持续总结更新,请持续关注!!!?🎉🎉

💗 大家好🤗🤗🤗,我是左手の明天!💗

📆 最近更新:2022 年 4 月 17 日,左手の明天的第?228?篇原创博客

🥇?更新于专栏:蓝桥杯预备营

🌟🌟 往期必看 🌟🌟

【蓝桥杯预备营集结一】软件类 C/C++ 预备试题分析及解答

【蓝桥杯预备营集结二】软件类 C/C++ 预备试题分析及解答

【蓝桥杯预备营集结三】软件类 C/C++ 预备试题分析及解答

【蓝桥杯预备营集结四】软件类 C/C++ 预备试题分析及解答

【蓝桥杯预备营集结五】第十三届蓝桥杯模拟赛 C/C++ 试题分析及解答

【蓝桥杯预备营集结六】软件类 C/C++ 预备试题分析及解答

【蓝桥杯预备营集结七】软件类 C/C++ 预备试题(分支结构+循环结构类)分析及解答

【蓝桥杯预备营集结八】软件类 C/C++ 预备试题分析及解答


目录

🚩试题A

🚩试题B

🚩试题C

🚩试题D

🚩试题E

🚩试题F

🚩试题G

🚩试题H

🚩试题I


👍👍👍👍👍👍

🌟🌟?预祝各位能够得到好的名次?🌟🌟

🚩试题A

??问题描述

快速排序

排序在各种场合经常被用到。

快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,

用它把整个队列过一遍筛子,

以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。

再分别对子区间排序就可以了。

??代码

#include <stdio.h>
void swap(int a[], int i, int j)
{
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}
int partition(int a[], int p, int r)
{
    int i = p;
    int j = r + 1;
    int x = a[p];
    while(1){
        while(i<r && a[++i]<x);
        while(a[--j]>x);
        if(i>=j) break;
        swap(a,i,j);
    }
    swap(a,p,j);
    return j;
}
void quicksort(int a[], int p, int r)
{
    if(p<r){
        int q = partition(a,p,r);
        quicksort(a,p,q-1);
        quicksort(a,q+1,r);
    }
}
int main()
{
    int i;
    int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
    int N = 12;
    
    quicksort(a, 0, N-1);
    
    for(i=0; i<N; i++) printf("%d ", a[i]);
    printf("\n");
    
    return 0;
}

🚩试题B

??问题描述

抽签

X星球要派出一个5人组成的观察团前往W星。

其中:

A国最多可以派出4人。

B国最多可以派出2人。

C国最多可以派出2人。

....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。

数组a[] 中既是每个国家可以派出的最多的名额。

程序执行结果为:

DEFFF

CEFFF

CDFFF

CDEFF

CCFFF

CCEFF

CCDFF

CCDEF

BEFFF

BDFFF

BDEFF

BCFFF

BCEFF

BCDFF

BCDEF

....

(以下省略,总共101行)

??代码

#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024
void f(int a[], int k, int m, char b[])
{
    int i,j;
    
    if(k==N){ 
        b[M] = 0;
        if(m==0) printf("%s\n",b);
        return;
    }
    
    for(i=0; i<=a[k]; i++){
        for(j=0; j<i; j++) b[M-m+j] = k+'A';
        f(a,k+1,m-j,b);  
    }
}
int main()
{    
    int  a[N] = {4,2,2,1,1,3};
    char b[BUF];
    f(a,0,M,b);
    return 0;
}

🚩试题C

??问题描述

方格填数

如下的10个格子

+--+--+--+

| | | |

+--+--+--+--+

| | | | |

+--+--+--+--+

| | | |

+--+--+--+

填入0~9的数字。要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

??代码

#include <stdio.h>
#include <math.h>
int flag[3][4]; //表示哪些可以填数  
int mpt[3][4]; //填数  
bool visit[10];  
int ans = 0;  
void init()   //初始化  
{  
    int i,j;  
    for(i = 0 ; i < 3 ; i ++)  
        for(j = 0 ; j < 4 ; j ++)  
            flag[i][j] = 1;  
    flag[0][0] = 0;  
    flag[2][3] = 0;  
}  
void Solve()  
{  
    int dir[8][2] = { 0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};  
    int book = true;  
    for(int i = 0 ; i < 3 ; i ++)  
    {  
        for(int j = 0 ; j < 4; j ++)  
        {  
            //判断每个数周围是否满足  
            if(flag[i][j] == 0)continue;  
            for( int k = 0 ; k < 8 ; k ++)  
            {  
                int x,y;  
                x = i + dir[k][0];  
                y = j + dir[k][1];  
                if(x < 0 || x >= 3 || y < 0 || y >= 4 || flag[x][y] == 0) continue;  
                if(abs(mpt[x][y] - mpt[i][j]) == 1)  book = false;  
            }  
        }  
    }  
    if(book) ans ++;  
}  
void dfs(int index)  
{  
    int x,y;  
    x = index / 4;  
    y = index % 4;  
    if( x == 3)  
    {  
        Solve();  
        return;  
    }  
    if(flag[x][y])  
    {  
        for(int i = 0 ; i < 10 ; i ++)  
        {  
            if(!visit[i])  
            {  
                visit[i] = true;  
                mpt[x][y] = i;  
                dfs(index+1);  
                visit[i] = false;  
            }  
        }  
    }  
    else  
    {  
        dfs(index+1);  
    }  
}  
int main()  
{  
    init();  
    dfs(0);  
    printf("%d\n",ans);  
    return 0;  
}  

??结果

答案:1580


🚩试题D

??问题描述

方和

方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多4个正整数的平方和。

如果把0包括进去,就正好可以表示为4个数的平方和。

比如:

5 = 0^2 + 0^2 + 1^2 + 2^2

7 = 1^2 + 1^2 + 1^2 + 2^2

(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对4个数排序:

0 <= a <= b <= c <= d

并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

程序输入为一个正整数N (N<5000000)

要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:

5

则程序应该输出:

0 0 1 2

再例如,输入:

12

则程序应该输出:

0 2 2 2

再例如,输入:

773535

则程序应该输出:

1 1 267 838

??方法一

#include <stdio.h>
#include <math.h>
int main()  
{  
    int n;  
    int flag = false;  
    scanf("%d",&n);  
    for(int i = 0 ; i * i <= n ; i ++)  
    {  
        for(int j = 0 ; j * j <= n ; j ++){  
            for(int k = 0 ; k * k <= n ; k ++)  
            {  
                int temp = n - i*i - j*j - k*k;  
                double l = sqrt((double) temp);  
                if(l == (int)l )  
                {  
                    printf("%d %d %d %d\n",i,j,k,(int)l);  
                    flag = true;  
                    break;  
                }  
            }  
            if(flag)break;  
        }  
        if(flag)break;  
    }  
    return 0;  
}  

??方法二

#include <stdio.h>
#include <math.h>
int mpt[5000010] ={0};  //mpt[i] = 1表示i 能够用两个完全平方数相加而得。  
int n;  
void init()  
{  
    for(int i = 0 ; i*i <= n ; i ++)  
        for(int j = 0 ; j*j <=n ; j ++)  
            if(i*i+j*j <= n) mpt[i*i+j*j] = 1;  
}  
int main()  
{  
    int flag = false;  
    scanf("%d",&n);  
    init();  
    for(int i = 0 ; i * i <= n ; i ++)  
    {  
        for(int j = 0 ; j * j <= n ; j ++){  
            if(mpt[n - i*i - j*j] == 0) continue;   //如果剩下的差用两个完全平方数不能组合出来就不继续  
            for(int k = 0 ; k * k <= n ; k ++)  
            {  
                int temp = n - i*i - j*j - k*k;  
                double l = sqrt((double) temp);  
                if(l == (int)l )  
                {  
                    printf("%d %d %d %d\n",i,j,k,(int)l);  
                    flag = true;  
                    break;  
                }  
            }  
            if(flag)break;  
        }  
        if(flag)break;  
    }  
    return 0;  
}  

🚩试题E

??问题描述

交换瓶子

有N个瓶子,编号 1 ~ N,放在架子上。

比如有5个瓶子:

2 1 3 5 4

要求每次拿起2个瓶子,交换它们的位置。

经过若干次后,使得瓶子的序号为:

1 2 3 4 5

对于这么简单的情况,显然,至少需要交换2次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。

输入格式为两行:

第一行: 一个正整数N(N<10000), 表示瓶子的数目

第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

例如,输入:

5

3 1 2 5 4

程序应该输出:

3

再例如,输入:

5

5 4 3 2 1

程序应该输出:

2

??方法一

只要前边一个数比后边临近的大,就把他俩交换,然后,如果是交换了n-1次的话,就需要特别处理一下,这时的次数是n/2次


#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n;
	int num=0;
	scanf("%d",&n);
	int a[n+5];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<n;i++){
		if(a[i-1]>a[i]){
			swap(a[i-1],a[i]);
			num++;
		}
	}
	if(num==n-1){
		num=n/2;
	}
	cout<<num<<endl;
	return 0;
}

??方法二

这一种就是从0开始,找后边数中最小的那一个,如果不在合适的位置,就交换

#include<iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[n+5];
	for(int i=0;i<n;i++)
	    cin>>a[i];
	int min;
	int num=0;
	for(int i=0;i<n;i++){
		min=i;
		for(int j=i+1;j<n;j++){//找最小的 
			if(a[min]>a[j])
			    min=j;
		}
		if(min!=i){
			num++;
			swap(a[i],a[min]);
		}
	}
	cout<<num<<endl;
	return 0;
}

??方法三

由于瓶子是有序的1~N,所以下标是1的位置就应该放1号瓶子,以此类推?

#include <iostream>
using namespace std;
int main()
{
    int n,a[10005];
    cin>>n;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    int num = 0;
    for(int i = 1; i <= n; i++)
    {
        while(a[i] != i)  //如果数值和下标不相等,直接交换
        {
            swap(a[i],a[a[i]]);
            num++;
        }
    }
    cout<<num<<endl;
    return 0;
}

🚩试题F

??问题描述

最大比例

X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。

并且,相邻的两个级别间的比例是个固定值。

也就是说:所有级别的奖金数构成了一个等比数列。比如:

16,24,36,54

其等比值为:3/2

现在,我们随机调查了一些获奖者的奖金数。

请你据此推算可能的最大的等比值。

输入格式:

第一行为数字 N (0<N<100),表示接下的一行包含N个正整数

第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额

要求输出:

一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数

测试数据保证了输入格式正确,并且最大比例是存在的。

例如,输入:

3

1250 200 32

程序应该输出:

25/4

再例如,输入:

4

3125 32 32 200

程序应该输出:

5/2

再例如,输入:

3

549755813888 524288 2

程序应该输出:

4/1

??代码

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;  
#define LL long long  
struct fs  
{  
    LL up,down;  
};  
int n;  
LL arr[110];  
fs Fs[110];  
bool cmp(LL a,LL b)  
{  
    return a > b;  
}  
LL Gcd(LL a,LL b)  
{  
    if( b == 0 )return a;  
    return Gcd(b,a%b);  
}  
LL Get(LL a, LL b)  
{  
    if( a < b) a ^= b ^= a ^= b;  
    LL v[30];  
    queue<LL>team;  
    if( a == b || a / b == a) return b;  
    v[0] = a, v[1] = b;  
    v[2] = a / b;  
    int top = 3,i,j;  
    team.push(a/b);  
    while(team.size())  
    {  
        LL now = team.front();  
        team.pop();  
        for(i = 0 ; i < top ; i ++)  
        {  
            LL temp = (v[i] > now) ? v[i] / now : now / v[i];  
            bool find = false;  
            for(j = 0 ; j < top ; j ++)  
                if( v[j] == temp) find = true;  
            if(find == true) continue;  
            team.push(temp);  
            v[top++] = temp;  
        }  
    }  
    LL ans = v[0];  
    for(i = 0 ; i < top ; i ++)   
        if(v[i] != 1)   
        {  
            ans = v[i];  
            break;  
        }  
    for(i = 0 ; i < top ; i ++)  
        if( v[i] < ans && v[i] != 1) ans = v[i];  
    return ans;  
}  
int main()  
{  
    int i,j;  
    scanf("%d",&n);  
    for(i = 0 ; i < n ; i ++) scanf("%lld",&arr[i]);  
    sort(arr,arr+n,cmp);  
    int top = 1;  
    for(i = 1; i < n ; i ++)  
        if(arr[i] != arr[i-1]) arr[top++] = arr[i];  
    n = top;  
    for(i = 0 ; i < n - 1; i ++)  
    {  
        LL gcd = Gcd(arr[i],arr[i+1]);  
        Fs[i].up = arr[i] / gcd;  
        Fs[i].down = arr[i+1] / gcd;  
    }  
    LL x = Fs[0].up;  
    for(i = 0 ; i < n - 1 ; i ++)  
        x = Get(x,Fs[i].up);  
    LL y = Fs[0].down;  
    for(i = 0 ; i < n - 1; i ++)  
        y = Get(y,Fs[i].down);  
    printf("%lld/%lld\n",x,y);  
    return 0;  
} 

🚩试题G

??问题描述

土地测量

造成高房价的原因有许多,比如土地出让价格。既然地价高,土地的面积必须仔细计算。遗憾的是,有些地块的形状不规则,比如是如图1中所示的五边形。

?

一般需要把它划分为多个三角形来计算。已知三边求三角形的面积需要用海伦定理,

?

各条边长数据如下:

AB = 52.1

BC = 57.2

CD = 43.5

DE = 51.9

EA = 33.4

EB = 68.2

EC = 71.9

根据这些数据求五边形地块的面积。四舍五入到小数后两位。

??代码


#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
float f(float a,float b,float c){
	float S,A;
	S = (a+b+c)/2;
	A = sqrt(S*(S-a)*(S-b)*(S-c));
	return A;
}
int main(){
	double sum1,sum2,sum3;
	sum1=f(33.4,52.1,68.2);
	sum2=f(68.2,57.2,71.9);
	sum3=f(71.9,43.5,51.9);
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum1+sum2+sum3<<endl;
}

??结果

3789.86

🚩试题H

??问题描述

身份证

如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以!

因为有人的身份证最后一位是"X"

实际上,除了最后一位的X,不会出现其它字母!

身份证号码18位 = 17位 + 校验码

校验码的计算过程:

例如:身份证前17位 = ABCDEFGHIJKLMNOPQ

A~Q 每位数字乘以权值求和(每位数字和它对应的“权”相乘后累加)

17位对应的权值分别是:

7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

求出的总和再对11求模

然后按下表映射:

余数 0 1 2 3 4 5 6 7 8 9 10

校验码: 1 0 X 9 8 7 6 5 4 3 2

??代码

#include<iostream>
using namespace std;
char verifyCode(char* s)
{
	static int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	static char map[] = {'1','0','X','9','8','7','6','5','4','3','2'};
	int sum = 0;
	for(int i=0; i<17; i++)
	{
		sum += (s[i]-'0') * weight[i];  
	}
	cout<<sum<<endl;
	return map[sum%11];  
}
int main()
{
	char s[18]={};
	for(int i=0;i<17;i++)cin>>s[i];
	s[17] = verifyCode(s);
	for(int i=0;i<18;i++)cout<<s[i];
	cout<<endl;
}

🚩试题I

??问题描述

身份证排序

安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位

  • 输入

第一行一个整数n,表示有n个身份证号码
余下的n行,每行一个身份证号码。

  • 输出

按出生日期从大到小排序后的身份证号,每行一条

  • 输入样例

5
466272307503271156
215856472207097978
234804580401078365
404475727700034980
710351408803093165

  • 输出样例

404475727700034980
234804580401078365
215856472207097978
710351408803093165
466272307503271156

??代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(string s1,string s2){
	if(s1.substr(6,8) == s2.substr(6,8)){
		return s1 > s2;
	}
	else return s1.substr(6,8) > s2.substr(6,8);
}
int main(){
	int n;
	cin>>n;
	string s[n]; 
	for(int i = 0;i < n;i++){
		cin>>s[i];
	}
	sort(s,s+n,cmp);
	for(int i = 0;i < n;i++){
		cout<<s[i]<<endl;
	}
} 

🍊🍊🍊

总结不易,看到这那就来个三连吧,肝。。。🍺🍺🍺

🍊🍊🍊

署名:左手の明天


  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:22:53  更:2022-04-18 17:24:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:50:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码