有趣的代码——有故事背景的程序设计3
这篇文章再和大家分享一些有“背景”的程序设计,希望能够让大家学到知识的同时,对编程学习更感兴趣,更能在这条路上坚定地走下去。
目录
1.幻方问题
2.用函数打印九九乘法表
3.鸡兔同笼问题
4.字数统计
5.简单选择排序
1.幻方问题
幻方又称魔方阵,游戏规则是在一一个n*n的矩阵中填入1到n2的数字,使得每一行、每一列、每条对角线的累加和都相等。如下图所示是一个3阶幻方,每一行、每一列每条对角线的累加和都等于15。

解决幻方问题的方法很多,下面介绍一种“左上斜行法”的填数方法,该方法适用于任意奇数阶幻方,具体填数过程如下:
(1)由1开始填数,将1放在第1行的中间位置;
(2)将幻方想象成上下、左右相接,每次往左上角走一一步,会有下列情况:
①左上角超出上边界,则在最下边对应的位置填入下一个数,如图A所示;
②左上角超出左边界,则在最右边对应的位置填入下一个数,如图 B所示;
③按上述方法找到的位置已填数,则在原位置的同一列下一行填入下一个数,如图 C所示:

算法实现如下:
设数组a[n][n]表示幻方,当前填数的位置为(i,j),则其左上方的位置是(i-1,j-1),将被填的数作为循环变量。
1.初始化填数的位置,i=0,j=n/2;
2.在位置(i,j)填入1;
3.数字k从2~n*n重复执行下述操作:
3.1从位置(i,j)往左上角走到位置(i-1,j-1);
3.2如果i超出上边界,则i=n-1;
3.3如果j超出左边界,则j=n-1;
3.4如果位置(i,j)已经填数,则在原位置的同一列下一行填入k;否则,在位置(i,j)填入k
3.5k++;
代码实现如下:
#include<stdio.h>
int main()
{int arr[100][100]={0},num,i,j,k;//num是咱预处理的幻方阶数 int tempi,tempj;//这里的目的是暂存i,j的值,因为达到边界,i,j的值会发生变化printf("请输入1-100内的奇数:\n"); //只处理为奇数的方阵scanf("%d",&num);i=0;j=num/2;arr[i][j]=1;//算法中的1,2步骤 for(k=2;k<=num*num;k++){tempi=i;tempj=j;if(--i<0){ //判断当前位置是否超出上边界?i=num-1;}if(--j<0){ //判断当前位置是否超出左边界?j=num-1;}if(arr[i][j]>0){//如果该位置已经有数,则在该位置下面添加数字i=(tempi+1)%num;j=tempj;}arr[i][j]=k;}for(i=0;i<num;i++){for(j=0;j<num;j++)printf("%d\t",arr[i][j]);printf("\n");}return 0;
}
这里arr数组为100*100个元素,主要是在有较大测试范围的同时,不占用太多内存,大家自己测试时可以定义一个宏,然后用宏定义数组,这样方便大家根据需要调整数组大小,而且空间利用率更高。
简单优化一个点,使代码更简洁。
#include<stdio.h>
int main()
{int arr[100][100]={0},num,i,j,k;//num是咱预处理的幻方阶数 int tempi,tempj;//这里的目的是暂存i,j的值,因为达到边界,i,j的值会发生变化printf("请输入1-100内的奇数:\n"); //只处理为奇数的方阵scanf("%d",&num);i=0;j=num/2;arr[i][j]=1;//算法中的1,2步骤 for(k=2;k<=num*num;k++){tempi=i;tempj=j;i=(i-1+n)%n;//这两步属于是把取模玩明白了,大家可以细品一下 j=(j-1+n)%n;if(arr[i][j]>0){//如果该位置已经有数,则在该位置下面添加数字i=(tempi+1)%num;j=tempj;}arr[i][j]=k;}for(i=0;i<num;i++){for(j=0;j<num;j++)printf("%d\t",arr[i][j]);printf("\n");}return 0;
}
2.用函数打印九九乘法表
打印九九乘法表,要求用函数实现。
相信大家对于打印九九乘法表已经很熟悉了吧,我们在这里简单和函数结合一下,就满足这个故事背景了。
算法实现如下:
设函数Table99实现打印九九乘法表的功能
1.循环变量i从1到9,打印第i行;
1.1循环变量j从1到i,打印第j列;
1.1.1打印第i行第j列的值i*j;
1.1.2j++;
1.2第i行打印完毕,打印回车符;
1.3i++准备打印下一行;
代码实现如下:
#include<stdio.h>void Table99(void);int main()
{Table99(); return 0;
}void Table99(void)
{int i , j ;for(i = 1 ; i <= 9 ; i++){for(j = 1 ; j <= i ; j++)printf("%d * %d = %2d ", j , i , i * j);printf("\n");}
}
3.鸡兔同笼问题
笼子里共有M只头N只脚,问鸡和兔各有多少只?要求用函数实现。
这种题就是很典型的数学题用编程来解决,而根据我们的数学涵养,我们理应很容易列出二元一次方程组从而解决问题,现在只需要把方程式通过编程用表达式表现出来即可。
当然唯一要注意的是这里是用函数来解决,大家记住结合函数相关知识进行编程。
算法实现如下:
设函数Chicken为解决鸡兔同笼问题的函数。变量chicken表示鸡的个数,rabbit表示兔的个数,变量M表示头的个数,变量N表示脚的个数。
1.chicken从0~M重复执行下述操作:
1.1rabbit = M -chicken;
1.2如果(2*chicken+4*rabbit等于N),则跳出循环;
1.3将chicken++;
2.如果是提前跳出循环,则输出chicken和rabbit的值;
否则输出“无解”;
#include<Stdio.h>
void Chicken(int M , int N)
{int chicken,rabbit,count;for(chicken=0;chicken<=M;chicken++){rabbit=M-chicken;if(2*chicken+4*rabbit==N){printf("鸡有%d只,兔子有%d只",chicken,rabbit);break;} }if(chicken>M){printf("输入数据不合理,无解!");}
}
int main()
{int M,N;printf("请输入头的个数和脚的个数:");scanf("%d%d",&M,&N);Chicken(M,N);return 0;
}
4.字数统计
从键盘上输入若干行字符,统计出现的字符总数。
这个题本质就像题干一样很简单,我们只需要一直读取字符(并计数),等读到回车符即可结束。
算法实现如下:
设函数count统计每一行文字的字符数,算法如下:
1.ch=读入一个字符;
2.当ch不是回车时,重复执行下述操作;
2.1sum++;
2.2ch=读入下一个字符;
3.返回sum;
代码实现如下:
#include<stdio.h>
int Count(void)
{int sum=0;char ch;printf("请输入一行文字:");fflush(stdin);while((ch=getchar())!='\n') sum++;return sum;
} int main()
{int charcount=0;charcount=Count();printf("字符数:%d\n",charcount);return 0;
}
5.简单选择排序
将N个元素组成的无序序列调整为有序序列。
什么是简单选择排序呢?我们假设待排序元素进行升序排列,简单选择排序的基本思想是:将整个序列分为有序区和无序区,初始化时有序区为空,无序区含有所有元素;在无序区中找到最小的元素,将它与无序区中的第一个元素交换;不断重复上述过程,直到无序区只剩下一个元素。
算法实现如下:
设置函数Sort实现对无序序列arr[N]进行简单选择排序,参数n表示数组元素的个数。
1.循环变量i从0~n-2,重复执行n-1次下述操作:
1.1在序列arr[i]~arr[n-1]中查找最小值arr[min];
1.2交换arr[min]与arr[i];
1.3i++
2.输出arr[N];
代码实现如下:
#include<stdio.h>
#define N 8
void Sort(int arr[],int n)
{int i,j,min,temp;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++)if(arr[j]<arr[min]) min=j;temp=arr[i];arr[i]=arr[min];arr[min]=temp;}
} void Print(int arr[],int n)
{int i;for(i=0;i<n;i++)printf("%3d",arr[i]);printf("\n");
}int main()
{int i=0;int arr[N]={9,5,3,6,7,8,1,2};printf("排序前的序列时:");Print(arr,N);Sort(arr,N);printf("排序后的序列时:");Print(arr,N);return 0;
}相关文章:
有趣的代码——有故事背景的程序设计3
这篇文章再和大家分享一些有“背景”的程序设计,希望能够让大家学到知识的同时,对编程学习更感兴趣,更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…...
聚观早报 |国行PS5轻薄版开售;岚图汽车11月交付7006辆
【聚观365】12月2日消息 国行PS5轻薄版开售 岚图汽车11月交付7006辆 比亚迪推出12月限时优惠 特斯拉正式交付首批Cybertruck 昆仑万维发布「天工 SkyAgents」平台 国行PS5轻薄版开售 索尼最新的PlayStation5主机(CFI-2000型号组-轻薄版)国行版本正…...
Kafka 保证消息消费全局顺序性
当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一个或多…...
3分钟在CentOS 7上离线安装Docker
在CentOS 7上离线安装Docker的详细步骤如下: 环境检查和准备 检查内核版本:Docker要求系统为64位且内核版本至少为3.10。使用命令uname -r查看内核版本。 检查CentOS版本:通过命令cat /etc/redhat-release查看版本信息。 更新yum包࿰…...
GaussDB数据库SQL系列-触发器
目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附:表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器,以便在插入新记录时自动将记录的创建…...
网工学习10-IP地址
一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示,中间用…...
二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空
一、目的 在HiveSQL的DWD层中,需要对原始数据进行去重在内的清洗,结果一开始其他数据类型的清洗工作都正常,直到碰到转向比数据。 一般的SQL查询有数据,但是加上group by以后就没数据; 一般的SQL查询有数据…...
Docker—共享应用程序
现在您已经构建了一个映像,可以共享它。要共享Docker映像,您必须使用Docker注册表。默认注册表是Docker Hub,是您使用的所有图像的来源。 Docker ID(Docker标识) Docker ID允许您访问Docker Hub,这是世界上…...
Linux横向移动
Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…...
Ubuntu 20.0 + mysql 8.0 用户和密码修改
第一步 下载(简单,注意联网)Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …...
看懂lscpu的输出
文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …...
RoPE旋转位置编码浅析
RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…...
在 SQL Server 中备份和恢复数据库的最佳方法
在SQL Server中,创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述: 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…...
Java8 根据自定义属性去重
一、需求背景 有一个List集合,里面有n个Answer成员,成员种有m个属性,即: List<Answer> answers ...,现在我需要根据Answer的某一个属性对List去重(属性不固定),应该如何实现呢? 二、解决办法 需要满足上述需求,并不难,我们可以使用Java8提供的…...
Netty网络编程
入门案例 1、服务器端代码 public class HelloServer {public static void main(String[] args) {// 1、启动器,负责装配netty组件,启动服务器new ServerBootstrap()// 2、创建 NioEventLoopGroup,可以简单理解为 线程池 Selector.group(n…...
层三交换机解析(Layer 3 Switch)层3交换机
文章目录 层三交换机解析1. 概述1.1 什么是层三交换机1.2 层三交换机与路由器、二层交换机的比较 2. 层三交换机的工作原理2.1 基于MAC地址的转发2.2 基于IP地址的转发 3. 层三交换机的配置4. 常见问题与解答4.1 我应该使用路由器还是层三交换机?4.2 层三交换机可以…...
expect自动化交互
目录 1. expect作用: 2. expect语言用法: 3. 实例 1. expect作用: 是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题。 2. expect语言用法: spawn开启免…...
探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别
Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容:Web 2.0 时代以用户生成内容为特征,用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者,网络逐渐从被动浏览…...
c++基本常见错误总结
我们无论是在学习中还是在工作当中,总是会遇到各种各样的c编译错误问题,经常会有一种情况就是上一次好像遇到过这种问题,但是就是想不起来了(我就是这样)所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…...
鸿蒙原生应用/元服务开发-AGC分发如何生成密钥和和证书请求文件
HarmonyOS通过数字证书(.cer文件)和Profile文件(.p7b文件)等签名信息来保证应用的完整性,应用如需上架到华为应用市场必须通过签名校验。因此,开发者需要使用发布证书和Profile文件对应用进行签名后才能发布…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
