比赛题目链接:http://ls.openjudge.cn/fresh2017/
A、水仙花数
解题思想:在区间[L, R]之间寻找每一个水仙花数,满足:该数的各个数位上的数字的x次方之和等于该数本身,而x则是该数的位数,比如,1位数就是1次方,2位数就是2次方,3位数就是3次方……
参考代码:(来自:那一抹微笑)
#include<stdio.h>
#include<math.h>
int main()
{
int L,R,num,sum,num1;
int temp,digit,i,flag;
num=0;
flag=0;
temp=0;
scanf("%d %d",&L,&R);
for(num=L;num<=R;num++)
{
digit=0;
temp=num;
while(num!=0)
{
digit++;
num=num/10;
}
num=temp;
sum=0;
num1=0;
for(i=1;i<=digit;i++)
{
num1=num%10;
sum=pow(num1,digit)+sum;
num=num/10;
}
num=temp;
if(sum==num)
{
flag++;
printf("%d ",num);
}
}
if(flag==0)
printf("-1\n");
if(flag!=0)
printf("\n");
return 0;
}
B、计算正整数的位数
解题思想:只要该数大于0,就将其整除10,然后位数计数器加1,直至该数小于等于0。
参考代码:(来自:yick)
#include <stdio.h>
int main() {
int num, ret = 0;
scanf("%d", &num);
while (num) {
ret += 1;
num /= 10;
}
printf("%d\n", ret);
return 0;
}
C、军事机密
解题思想:先将n个数进行排序,然后再输出k个结果,需要注意,每个结果所在的下标对应的序号减1。
参考代码:(C++,来自:王亚军)
#include <cstdio>
#include <algorithm>
using namespace std;
int num[30000+1];
int main()
{
int n,k;
int i;
int a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
sort(num,num+n);
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%d",&a);
printf("%d\n",num[a-1]);
}
return 0;
}
D、3个整数最大数求解
解题思想:先比较前两个,再将其中较大者和第三个比较。
参考代码:(来自:何铃婕)
#include<stdio.h>
int main()
{
int num1,num2,num3;
int t;
scanf("%d%d%d",&num1,&num2,&num3);
t=num1;
if(num1<num2)
{
t=num2;
}
if(t<num3)
{
t=num3;
}
printf("%d\n",t);
return 0;
}
解题思想:先找到每个月后成虫和卵的数量的递推规律,如下所示:
x=1 y=2
卵的数量递推公式: =IF(月序号>=x, 第(月序号-x)月的成虫数*y,0),因为过x月才产卵
成虫数量递推公式: =IF(月序号>=2,第(月序号-2)月的卵数+上月的成虫数, 上月的成虫数),因为2个月以后才能长成成虫
月 卵数量 成虫数量
0 0 1
1 2 1
2 2 1
3 2 3
4 6 5
5 10 7
6 14 13
7 26 23
8 46 37
9 74 63
10 126 109
11 218 183
参考代码:(C++,来自:liuxi)
#include <iostream>
using namespace std;
typedef long long ll;
ll small[3000], male[3000];
int main() {
int x, y, z;
cin >> x >> y >> z;
for (int i = 1; i <= x; ++i) {
male[i] = 1;
small[i] = 0;
}
for (int i = x + 1; i <= z + 1; ++i) {
small[i] = y * male[i - x];
male[i] = male[i-1] + small[i - 2];
}
cout << male[z + 1] << endl;
return 0;
}
F、笨小猴
解题思路:统计单词中每个字母出现的次数,找出最大值和最小值(切记:只计算出现过的字母,未出现的字母不参加统计),计算其差,判断差是否是素数。
参考代码:(来自:volkia)
#include<stdio.h>
int a[26];
int main() {
char c[200];
scanf("%s", c);
int mx = 0, mn = 200;
int flag = 1;
memset(a, 0, sizeof(a));
for (int i = 0; i < strlen(c); ++i) {
int x = c[i] - 'a';
++a[x];
}
for (int i = 0; i < 26; ++i) {
if (!a[i]) continue;
if (a[i] > mx) mx = a[i];
if (a[i] < mn) mn = a[i];
}
int x = mx - mn;
for (int i = 2; i < x / 2; ++i) {
if (x % i == 0) {
flag = 0;
break;
}
}
if (x <= 1) flag = 0;
printf("%s\n", flag ? "Lucky Word" : "No Answer");
printf("%d\n", flag ? x : 0);
return 0;
}
G、A+B
例题
H、连接两个数
解题思路:有很多种方法完成此题,可以直接输出,可以字符串连接,也可以老老实实地计算。
参考代码:(来自:姜伟)
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d%d",a,b);
return 0;
}