2019蓝桥杯校赛

1)2019的二进制
win+r, calc 打开计算器
在这里插入图片描述
选择查看->程序员。
在这里插入图片描述
输入2019直接转换
在这里插入图片描述


2)1200000约数的个数
代码穷举

#include <stdio.h>
int main()
{
	int count=0;
	for(int i=1;i<=1200000;i++)
	{
		if(1200000%i==0)
			count++;
	}
	printf("%d\n", count);
	return 0;
}

其实还可以用手算法。
分解素因数
1200000=27x31x55
(7+1)x(1+1)x(5+1)=96


3)2019节点无向图最大边数
有个公式
n结点最大边数=n*(n-1)/2。
ps:其实就算不知道什么是无向图,不知道这个公式。也可以自己推出来。


4)1-2019内含9的数的数量
代码遍历1-2019,一个一个判断即可。
有个技巧,判断数字是否含9时,可先利用sprintf(s,"%d",num)将数字转换为字符串,直接判断字符串是否含9。(因为它是填空题,没有时间复杂性要求,尽快写出代码即可。如果是编程题,就要考虑是sprintf快还是手工提取位数快了)

#include <stdio.h>
#include <string.h>
int inc9(int n)
{
	char ns[8];
	sprintf(ns,"%d",n);
	if(strchr(ns,'9'))
			return 1;
	return 0;
}
int main()
{
	int count;
	for(int i=1;i<=2019;i++)
		if(inc9(i))
			count++;
	printf("%d\n",count);
	return 0;
}

5)输入一个只包含小写字母的字符串,求这个字符串中元、辅音字母的数量
直接遍历字符串即可

#include <stdio.h>
#include <string.h>
int main()
{
	char s[1005];
	scanf("%s",s);
	int y=0,f=0,len=strlen(s);
	for(int i=0;i<len;i++)
	{
		if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
			y++;
		else 
			f++;
	}
	printf("%d\n",y);
	printf("%d\n",f);
	return 0;
}

6)有n个数,从中选一对数,它们之和是m的倍数,有多少对这样的数?
只要知道如何从n个数中找2个数的所有组合,这个问题就迎刃而解了。

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n, m;
	scanf("%d%d",&n,&m);
	int *arr=(int *)malloc(sizeof(int)*n);
	for (int i = 0; i < n; i++)
		scanf("%d",arr+i);

	int r = 0;
	for (int i = 0; i < n; i++)
		for (int j = i + 1; j < n; j++)
			if ((arr[i] + arr[j]) % m == 0)
					r++;
	printf("%d\n",r);
	return 0;
}

7)找出1~n内各位上没有重复数字的个数
1.遍历1~n
2.对每个数,判断各位是否重复。判断方法有两种:
第1种) 把这个数分解成位,求任意两位组成的所有组合。若都不相等,则这个数符合要求,否则不符合。这个是我考试时用的方法。
第2种) 事后想想,判断各位是否重复其实有更简单的方法。弄一个包含10个元素的计数数组,让其初值全为0。其元素0~9的值对应待判断数各位0~9出现的次数。遍历待判断数的每一位,当前位的值是几,计数数组对应的元素就加1,若加1后元素值大于1,则证明待判断数各位上有重复数字出现,重复数字就是当前元素的下标。若遍历完,仍没有数组元素大于1,则这个数各位没有重复数字出现。
第一种方法代码:

#include <stdio.h>
#include <string.h>
int isy(int n)
{
	char s[50];
	sprintf(s,"%d",n);
//	printf("%d %s\n",n,s);
	int len=strlen(s);
	for(int i=0;i<len;i++)
		for(int j=i+1;j<len;j++)
			if(s[i]==s[j])
				return 0;
	return 1;
}
int main()
{
	int n;int r=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		if(isy(i))
			r++;
	printf("%d\n",r);
//	printf("%d\n",isy(10));
	return 0;
}

第二种方法代码:

#include <stdio.h>
#include <string.h>
int isy(int n)
{
	char s[50];
	sprintf(s,"%d",n);
	int len=strlen(s);
	int cnt[10]={0};
	for(int i=0;i<len;i++)
		if(++cnt[s[i]-'0'] > 1)
			return 0;
	return 1;
}
int main()
{
	int n;int r=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		if(isy(i))
			r++;
	printf("%d\n",r);
	return 0;
}

8)梅花桩,不会,打的样例


9)花店运花,具体要求忘了。思路就是找到m列矩阵前n列与后(m-n)列之和相等的情况。穷举法找到前n列之和与余下之后相等即可。


10)不会,打的样例

posted @ 2022-04-19 18:17  enbug  阅读(16)  评论(0编辑  收藏  举报