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)不会,打的样例