蓝桥杯专题-真题版含答案-【九宫幻方】【打鱼还是晒网】【阶乘尾数零的个数】【等差素数列】

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,获取更多支持,交流让学习不再孤单

👉实践过程

需要所有整理的文档可底部卡片联系我,直接发压缩包。

😜九宫幻方

小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。

三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:"二四为肩,六八为足,左三右七,戴九履一,五居其中",

通过这样的一句口诀就能够非常完美的构造出一个九宫格来。

4 9 2

3 5 7

8 1 6

有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。

现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,

并且希望她能够判断出究竟是不是只有一个解。

而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~

输入格式:

输入仅包含单组测试数据。

每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。

对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。

输出格式:

如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出"Too Many"(不包含引号)。

样例输入

0 7 2

0 5 0

0 3 0

样例输出

6 7 2

1 5 9

8 3 4

c 复制代码
int all[8][9] = {{4, 9, 2, 3, 5, 7, 8, 1, 6},
                 {8, 1, 6, 3, 5, 7, 4, 9, 2},//上下
                 {2, 9, 4, 7, 5, 3, 6, 1, 8},//左右
                 {8, 3, 4, 1, 5, 9, 6, 7, 2},//右旋
                 {4, 3, 8, 9, 5, 1, 2, 7, 6},//右旋:左右
                 {6, 7, 2, 1, 5, 9, 8, 3, 4},//右旋:上下
                 {6, 1, 8, 7, 5, 3, 2, 9, 4},//再右旋
                 {2, 7, 6, 9, 5, 1, 4, 3, 8}}//再右旋之右旋
;

int test(int data[9]) {
    int cnt = 0, ans = -1;
    for (int i = 0; i < 8; ++i) {
        bool ok = true;
        for (int j = 0; j < 9; ++j) {
            if (data[j] == 0)continue;
            if (data[j] != all[i][j]) {
                ok = false;
                break;
            }
        }
        if (ok) {
            cnt++;
            ans = i;
        }
    }
    if (cnt == 1) {
        return ans;
    } else {
        return -1;
    }
}

int main(int argc, const char *argv[]) {
    int data[9];
    for (int i = 0; i < 9; ++i) {
        scanf("%d", &data[i]);
    }
    int index = test(data);
    if (index == -1) {
        printf("Too Many\n");
    } else {
        printf("%d %d %d\n", all[index][0], all[index][1], all[index][2]);
        printf("%d %d %d\n", all[index][3], all[index][4], all[index][5]);
        printf("%d %d %d\n", all[index][6], all[index][7], all[index][8]);
    }
    return 0;
}

😜打鱼还是晒网

中国有句俗语叫"三天打鱼两天晒网"。某人从1990年1月1日起开始"三天打鱼两天晒网",问这个人在以后的某一天中是"打鱼"还是"晒网"。

*问题分析与算法设计

根据题意可以将解题过程分为三步:

1)计算从1990年1月1日开始至指定日期共有多少天;

2)由于"打鱼"和"晒网"的周期为5天,所以将计算出的天数用5去除;

3)根据余数判断他是在"打鱼"还是在"晒网";

若 余数为1,2,3,则他是在"打鱼"

否则 是在"晒网"

在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:

如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)

则 该年是闰年;

否则 不是闰年。

C语言中判断能否整除可以使用求余运算(即求模)

c 复制代码
#include<stdio.h>
int days(struct date day);
struct date{
int year;
int month;
int day;
};
int main()
{
struct date today,term;
int yearday,year,day;
printf("Enter year/month/day:");
scanf("%d%d%d",&today.year,&today.month,&today.day); /*输入日期*/
term.month=12; /*设置变量的初始值:月*/
term.day=31; /*设置变量的初始值:日*/
for(yearday=0,year=1990;year<today.year;year++)
{
term.year=year;
yearday+=days(term); /*计算从1990年至指定年的前一年共有多少天*/
}
yearday+=days(today); /*加上指定年中到指定日期的天数*/
day=yearday%5; /*求余数*/
if(day>0&&day<4) printf("he was fishing at that day.\n"); /*打印结果*/
else printf("He was sleeping at that day.\n");
}
int days(struct date day)
{
static int day_tab[2][13]=
{{0,31,28,31,30,31,30,31,31,30,31,30,31,}, /*平均每月的天数*/
{0,31,29,31,30,31,30,31,31,30,31,30,31,},
};
int i,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0;
/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/
for(i=1;i<day.month;i++) /*计算本年中自1月1日起的天数*/
day.day+=day_tab[lp][i];
return day.day;
}
*运行结果
Enter year/month/day:1991 10 25
He was fishing at day.
Enter year/month/day:1992 10 25
He was sleeping at day.
Enter year/month/day:1993 10 25
He was sleeping at day.

😜阶乘尾数零的个数

100!的尾数有多少个零?

*问题分析与算法设计

可以设想:先求出100!的值,然后数一下末尾有多少个零。事实上,与上题一样,由于计算机所能表示的整数范围有限,这是不可能的。

为了解决这个问题,必须首先从数学上分析在100!结果值的末尾产生零的条件。不难看出:一个整数若含有一个因子5,则必然会在求100!时产生一个零。因此问题转化为求1到100这100个整数中包含了多少个因子5。若整数N能被25整除,则N包含2个因子5;若整数N能被5整除,则N包含1个因子5。

c 复制代码
#include<stdio.h>
int main()
{
int a,count =0;
for(a=5;a<=100;a+=5) //循环从5开始,以5的倍数为步长,考察整数
{
++count; //若为5的倍数,计数器加1
if(!(a%25)) ++count; //若为25的倍数,计数器再加1
}
printf("The number of 0 in the end of 100! is: %d.\n",count); //打e印结果
return 0; 
}
*运行结果
The number of 0 in the end of 100! is: 24.

😜等差素数列

2,3,5,7,11,13,...是素数序列。

类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。

上边的数列公差为30,长度为6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。

这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为10的等差素数列,其公差最小值是多少?

c 复制代码
#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
typedef long long LL;
set<int>all;

bool isPrime(LL t) {
    for (int i = 2; i < t / 2; ++i) {
        if (t % i == 0)return false;
    }
    return true;
}

int f(LL a[], int n) {
    for (int i = 0; i < n; ++i) {//枚举首项
        LL first = a[i];
        for (int delta = 1; delta < a[n - 1] - first; ++delta) {//枚举公差
            int m = first;
            for (int j = 1; j < 10; ++j) {//枚举个数
                m += delta;
                if (all.find(m) == all.end()) //m不是素数
                    break;
                if (m > a[n - 1])break;
                if (j == 9)//已经找到10项
                    return delta;
            }
        }
    }
    return -1;
}
const int N=5000;
LL a[N];
int main(int argc, const char *argv[]) {
    a[0] = 2;
    a[1] = 3;
    all.insert(2);
    all.insert(3);

    int index = 2;
    LL t = 5;
    while (index < N) {
        if (isPrime(t)) {
            a[index++] = t;
            all.insert(t);
        }
        t++;
    }
    cout<<f(a, N)<<endl;
    return 0;
}

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步 ☁️,我观你气度不凡 ,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞 👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。

相关推荐
源代码:趴菜5 小时前
LeetCode63:不同路径II
算法·leetcode·职场和发展
严格格5 小时前
三范式,面试重点
数据库·面试·职场和发展
南加第一划水5 小时前
Leetcode 每日一题:Evaluate Division
算法·leetcode·职场和发展
鱼跃鹰飞7 小时前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
天玑y15 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
自陈16 小时前
蓝桥杯嵌入式客观题合集
蓝桥杯·蓝桥杯嵌入式客观题
DANGAOGAO20 小时前
蓝桥杯4. Fizz Buzz 经典问题
算法·蓝桥杯
weixin_4462608520 小时前
24年蓝桥杯及攻防世界赛题-MISC-3
网络安全·蓝桥杯
戊子仲秋21 小时前
【LeetCode】每日一题 2024_9_19 最长的字母序连续子字符串的长度(字符串,双指针)
算法·leetcode·职场和发展
weixin_4462608521 小时前
24年蓝桥杯及攻防世界赛题-MISC-2
网络安全·蓝桥杯