2019年蓝桥杯c/c++ B组

年号子串

  • 这个题自己笔算也很好算出,就当线下多练一下,就敲个代码
    试题 B: 年号字串

【问题描述】小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 52, LQ 对应 329。请问 2019 对应的字符串是什么?

思路就是26进制,算出来的数就是第几个字母,比如27 ,27/26=1 --27%26=1,所以27的26进制表示法就是1 1,即AA。
我这里也只求出26进制表示,没有具体到哪个字母。

#include<iostream>

using namespace std;

int a[20];
int i = 0;
int digui(int w) {//用了一下递归,还是要看一下16进制,8进制间的进制转换什么的,自己写写。
	int x, y;
	x = w / 26;
	y = w % 26;
	if (x != 0) {
		a[i] = y;
		i++;
	}
	
	if (x == 0) {
		
		a[i] = w;
		

	}
	else return digui(x);

	

}

int main()
{
	int m;
	
	
	cin >> m;
	digui(m);
	for(int j=i;j>=0;j--)
	cout << a[j];
	}


– 开始没想到进制转换,后来看了一下别人的解题报告,自己还是太low,
附上代码和原博客。

#include<stdio.h>
int main(){
	int n = 2019;
	int i=0;
	char s[10];
	while(n>0){
		s[i++] = n%26+'A'-1;
		n/=26;
	}
	
	for(;i>0;i--){
		printf("%c",s[i-1]);
	}
	printf("\n");
	return 0;
}

原博文

D题 数的分解

问题描述:

    把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?
    注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18和1001+1000+18被视为同一种。

开始就是直接3个for循环暴力解开,由于没注意到要三个互不形同的数,开始结果不对,以后要好好读题啊。运算时间挺长的,但如果用两个for循环就特别快,这也就说明了优化是多么的重要。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int no_two_four(int n) {//判断有没有2和4
	int t = 1000;
	while (t > 0) {
		if (n /t  == 2 || n / t == 4) { return 1; }

		else {
			n = n % t;
			t /= 10;
		}

	}
	return 0;



}

int main() {
	int i, j, k, sum = 0;
	for (i = 1; i < 2020; i++) {//三层循环,比较慢,但是填空题没有时间要求
		if (no_two_four(i)) {
			continue;
		}
		for (j = 1; j < 2020; j++) {
			if (no_two_four(j)||i==j) {
				continue;
			}
			for (k = 1; k < 2020; k++) {
				if (no_two_four(k)||i==k||j==k)
					continue;
				if (i + j + k == 2019)sum++;

			}

		}

	}
	cout<<sum/6;//3个数字位置有重复,所以除6 ,排列组合

}
  • 也可以直接用两个for减少运算量
#include<stdio.h>
int isok(int n){

	while(n>0){
		if(n%10==2 || n%10==4){
			return 1;
		}else{
			n=n/10;
		}
	}
	return 0;
}

int main(){
	int i,j,k,tot=0;
	for(i=1;i<=2018;i++){
		if(isok(i)){
			continue;
		}
		for(j=1;j<=2018;j++){
			if(isok(j)){
				continue;
			}
			k=2019-i-j;//k有可能小于0,所以要在下面排除一下。
			if(isok(k)==0&&i!=j&&i!=k&&j!=k&&k>0)tot++;


			}
		}

	printf("%d\n",tot/6);
	return 0;
}

  • 当然还有两次for循环次数少的,就是开始就让其有顺序
  • 代码来自别人原文
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

int panduan(int i, int j, int k)
{
	int t = 1;
	while (i)
	{
		if (i % 10 == 2 || i % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			i = i / 10;
	}
	while (t == 1 && j)
	{
		if (j % 10 == 2 || j % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			j = j / 10;
	}
	while (t == 1 && k)
	{
		if (k % 10 == 2 || k % 10 == 4)
		{
			t = 0;
			break;
		}
		else
			k = k / 10;
	}
	return t;
}

int main()
{
	int i, j, k;
	long long sum = 0;
	for (i = 1; i <= 672; i++)
	{
		for (k = 674; k <= 2017; k++)
		{
			j = 2019 - i - k;
			if ((i < j && j < k) && (panduan(i, j, k) == 1))
				sum++;
		}
	}
	printf("%I64d\n", sum);
	system("pause");
	return 0;
}

发布了18 篇原创文章 · 获赞 0 · 访问量 262

猜你喜欢

转载自blog.csdn.net/qq_42815711/article/details/104263323
今日推荐