今天是【蓝桥杯】模拟的6个练习题。
一、纸张尺寸
纸张尺寸6
问题描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm × 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
将数字以字符形式读入时,做比较or运算应当先将字符转化为数字。+‘0’。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(void)
{
double a = 1189, b = 841; //题意需向下取整,用double
string s;
cin>> s;
int t;
for(int i = 0; i < (s[1]-'0'); i++) //字符-'0'转化为数字
{
a =floor(a/2);
if(a < b)
swap(a,b);
}
printf("%.0lf\n%.0lf",a,b);
return 0;
}
二、排列字母
排列字母7
题目描述:
小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO 排列后为 AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。
请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY
string容器的头文件直接写cstring就好。
s.begin(),s.end()返回迭代器。s.begin()返回元素中第一个元素的迭代器。
s.end()返回容器的尾部,即第n个元素再往后的“边界”。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
string s;
cin>> s;
sort(s.begin(),s.end());
cout<< s;
return 0;
}
三、数位排序
数位排序8
问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m个的元 素是多少?
输入格式
输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。
bool cmp(int x,int y),如果return true,则将x排在y的前面。
另写一个get_sum()函数求各个数位之和。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e6+10;
int a[N];
int get_sum(int t)
{
int sum = 0;
while(t)
sum += t%10, t /= 10;
return sum;
}
bool cmp(int x,int y) //return true的话,x排在y的前面。
{
if( get_sum(x) != get_sum(y) )
return get_sum(x) < get_sum(y);
return x < y;
}
int main(void)
{
int n,m;
cin>> n >> m;
for(int i = 1; i < n+1; i++)
a[i] = i;
sort(a+1,a+n+1,cmp);
cout<< a[m] << endl;
return 0;
}
四、数字反转
数字反转9
题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。
输入描述
输入共 1 行,一个整数 N,−109 ≤ N ≤ 109。
输出描述
输出共 1 行,一个整数,表示反转后的新数。
题解一:反转整数
bool is_minus = n < 0;这一串是定义了一个bool类型的变量,同时把后面表达式的值赋值给is_minus。
minus一般表示负数。
#include<iostream>
using namespace std;
int main(void)
{
int n;
cin>> n;
bool is_minus = n < 0;
if(is_minus)
n = -n;
int t = 0;
while(n)
{
t = t*10 + n%10;
n /= 10;
}
if(is_minus)
t = -t;
cout<< t << endl;
return 0;
}
题解二:反转字符
reverse()可以把List中所有元素倒转。
常用于数组,字符串,容器。头文件是algorithm
reverse函数用于反转在 [first,last)范围内的顺序,reverse函数没有返回值。
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin>> s;
if(s[0] == '-')
{
reverse(s.begin()+1,s.end());
cout<< '-';
for(int i = 1; i <= 10; i++)
{
if(s[i] != '0')
{
for(int j = i; j <= 10; j++)
{
if(s[j] == '\0')
return 0;
cout<< s[j];
}
}
}
}
else
{
reverse(s.begin(),s.end());
for(int i = 0; i <= 10; i++)
{
if(s[i] != '0')
{
for(int j = i; j <= 10; j++)
{
if(s[j] == '\0')
return 0;
cout<< s[j];
}
}
}
}
return 0;
}
五、ISBN号码
ISBN号码10
题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 “x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4 就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以 1 加上次位数字乘以 2 …… 以此类推,用所得的结果 mod 11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162这9 个数字,从左至右,分别乘以 1,2,…,9,再求和,即 0×1+6×2+……+2×9=158,然后取 158 mod 11 的结果 4 作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。
输入描述
输入一行,是一个字符序列,表示一本书的 ISBN 号码(保证输入符合 ISBN 号码的格式要求)。
输出描述
输出一行,假如输入的 ISBN 号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的 ISBN 号码(包括分隔符“-”)。
例:0-670-82162-4 输出Right
0-670-82162-0 输出0-670-82162-4
// ISBN
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
//x-xxx-xxxxx-x
int main(void)
{
string s;
cin>> s;
for(int i = 0; i < 12; i++)
{
if(s[i] != '-')
s[i] = s[i] -'0'; //转化为数字
}
int res = s[0]*1 + s[2]*2 + s[3]*3 + s[4]*4 + s[6]*5 + s[7]*6 + s[8]*7 + s[9]*8 + s[10]*9;
res %= 11;
if(res == s[12]-'0' || res == 10 && s[12] == 'X')
{
cout<< "Right";
return 0;
}
else
{
for(int i = 0; i < 12; i++)
{
if(s[i] != '-')
{
char str = s[i] + '0';
cout<< str;
}
if(s[i] == '-')
cout<<'-';
}
if(res < 10) cout<< res ;
if(res == 10) cout<< "X";
}
return 0;
}
六、天干地支
天干地支11
题目描述:
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。
2020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。
每过 60年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60 年轮回一次。例如 1900 年,1960 年,2020年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。
输入描述
输入一行包含一个正整数,表示公元年份。
其中有 ,输入的公元年份为不超过 9999 的正整数。
输出描述
输入一行包含一个正整数,表示公元年份。
先算出公元0年对应的天干地支,gengshen。
然后对tiangan,dizhi数组重新排序,将geng,shen移到最前面。便于求模计算。
// 天干地支
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
string tiangan[] = {"geng","xin","ren","gui","jia","yi","bing","ding","wu","ji"};
string dizhi[] = {"shen","you","xu","hai","zi","chou","yin","mao","chen","si","wu","wei"};
//数组这个初始化格式要记记记
int main(void)
{
int n;
cin>> n;
cout<< tiangan[n%10] << dizhi[n%12];
return 0;
}
持续更新,欢迎一起学习。