# 蓝桥杯赛前冲刺30天打卡题解（Day2）

43 篇文章 1 订阅
14 篇文章 2 订阅

## 一、排它平方数

1. 66 位正整数；
2. 每个数位上的数字不同；
3. 其平方数的每个数位不含原数字的任何组成数位。

思路1：先定义俩个数组a和b，存放（这个六位数和它的平方）的每一位数，然后先判断这个六位数是否每个数位上的数字不同，再判断其平方数的每个数位不含原数字的任何组成数位。

解答一：暴力

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int a[5], b[12];
long long i, t, j, k, n, m;
int flag;
for(i = 100000; i <= 999999; i++)
{
flag = 1;
t = i * i;
a[0] = i % 10;
a[1] = i % 100 / 10;
a[2] = i % 1000 / 100;
a[3] = i % 10000 / 1000;
a[4] = i % 100000 / 10000;
a[5] = i % 1000000 / 100000;
if(i <= 316227)
{
b[0] = t % 10;
b[1] = t % 100 / 10;
b[2] = t % 1000 / 100;
b[3] = t % 10000 / 1000;
b[4] = t % 100000 / 10000;
b[5] = t % 1000000 / 100000;
b[6] = t % 10000000 / 1000000;
b[7] = t % 100000000 / 10000000;
b[8] = t % 1000000000 / 100000000;
b[9] = t % 10000000000 / 1000000000;
b[10] = t % 100000000000 / 10000000000;
}
else
{
b[0] = t % 10;
b[1] = t % 100 / 10;
b[2] = t % 1000 / 100;
b[3] = t % 10000 / 1000;
b[4] = t % 100000 / 10000;
b[5] = t % 1000000 / 100000;
b[6] = t % 10000000 / 1000000;
b[7] = t % 100000000 / 10000000;
b[8] = t % 1000000000 / 100000000;
b[9] = t % 10000000000 / 1000000000;
b[10] = t % 100000000000 / 10000000000;
b[11] = t % 1000000000000 / 100000000000;
}
for(j = 0; j <= 5; j++)
{
for(k = j + 1; k <= 5; k++)
{
if(a[j] == a[k])
flag = 0;
}
}
n = 0;
for(n = 0; n <= 5; n++)
{
for(m = 0; m <= 11; m++)
{
if(a[n] == b[m])
{
flag = 0;
}
}
}
if(flag == 1)
break;
}
printf("%lld", i);
return 0;
}

PS：暴力在检测时不通过，原因为：运行时间太长，所以我们要换第二种思路

#include <stdio.h>
#include <stdlib.h>
int check(long long x, long long xx)
{
int i, j;
char str1[10];
char str2[20];
sprintf(str1, "%lld", x);
sprintf(str2, "%lld", xx);
for (i = 0; str1[i] != '\0'; i++)
{
for (j = 0; str2[j] != '\0'; j++)
{
if (str1[i] == str2[j])
return 0;
}
}
return 1;
}

int main()
{
long long a, b, c, d, e, f;
for (a = 1; a < 10; a++)
{
for (b = 0; b < 10; b++)
{
if (b != a)
for (c = 0; c < 10; c++)
{
if (c != a && c != b)
for (d = 0; d < 10; d++)
{
if (d != a && d != b && d != c)
for (e = 0; e < 10; e++)
{
if (e != a && e != b && e != c && e != d)
for (f = 0; f < 10; f++)
{
if (f != a && f != b && f != c && f != d && f != e)
{
long long x = a * 100000 + b * 10000 + c * 1000 + d * 100 + e * 10 + f;
if (check(x, x * x) && x != 203879)
{
printf("%lld", x);
}
}
}
}
}
}
}
}
return 0;
}

## 二、买不到的数目

小明开了一家糖果店。他别出心裁：把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆包卖。

4 7

17

思路：核心利用：两个数a和b，如果互质，那么最大不能组成的数是a*b-a-b。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d", a * b - a - b);
return 0;
}


## 三、回文日期

2020 年春节期间，有一个特殊的日期引起了大家的注意：2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202，恰好是一个回文数。我们称这样的日期是回文日期。

20200202

20211202
21211212

这道题，直接暴力就完事了。下面给上代码

#include <iostream>
using namespace std;

int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int y, int m, int d) //判断是否是合法日期
{
if (d <= 0 || m <= 0 || m >= 13) return false;
if (m != 2)
{
if (d > months[m]) return false;
}
else
{
int days = months[2] + (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
if (d > days) return false;
}

return true;
}

int flip(int x)
{
int res = 0;
while (x)
{
res = res * 10 + x % 10;
x /= 10;
}
return res;
}

bool st1, st2;
int ans1, ans2;

int main()
{
int n;
cin >> n;

for (int i = n + 1; i <= 89991231; i++)
{
int year = i / 10000, month = i % 10000 / 100, day = i % 100;
if (check(year, month, day))
{
if (i % 10000 == flip(year) && !st1)
st1 = true, ans1 = i;

if (i % 10000 == flip(year) && (month / 10 == day / 10) && (month % 10 == day % 10) && !st2)
st2 = true, ans2 = i;
}

if (st1 && st2) break;
}

printf("%d\n%d\n", ans1, ans2);
return 0;
}

## 四、约瑟夫环

n 个人的编号是 1 ~ nn，如果他们依编号按顺时针排成一个圆圈，从编号是 1 的人开始顺时针报数。
（报数是从 1 报起）当报到 kk 的时候，这个人就退出游戏圈。下一个人重新从 1 开始报数。

10 3

4

#include <stdio.h>
int main()
{
int n,k,i,j=0;
scanf("%d %d",&n,&k);
for(i=1; i<=n; i++)
{
j=(j+k)%i;
}
j++;
printf("%d",j);
return 0;
}

• 1
点赞
• 2
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论
05-27
09-04
12-19
02-23
06-15 472
11-18 520

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

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

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