【蓝桥杯】模拟2

今天是【蓝桥杯】模拟的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;
}

持续更新,欢迎一起学习。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing小星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值