有趣的代码——有故事背景的程序设计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文件对应用进行签名后才能发布…...
工业级RS-485收发器自主设计:从电路原理到PCB布局的实战指南
1. 项目概述与核心价值 在工业自动化、楼宇控制、能源监控这些领域里,设备之间要“说话”,RS-485总线绝对是那个最可靠、最耐用的“方言”。你可能在PLC、变频器、智能电表或者一堆传感器上见过那两个标着A、B的端子,背后驱动它们的ÿ…...
英雄联盟智能BP与战绩查询:你的排位赛终极助手
英雄联盟智能BP与战绩查询:你的排位赛终极助手 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否曾经在排位赛BP阶段手忙脚乱,不知道该禁用哪个英雄?或者想了解队友和对…...
终极指南:使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件
终极指南:使用XNBCLI高效解包打包星露谷物语XNB游戏资源文件 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli XNB文件是星露谷物语等XNA游戏引擎使用…...
音乐学者必看的NotebookLM冷启动指南,从乐谱OCR识别到和声进行语义建模,一步到位
更多请点击: https://intelliparadigm.com 第一章:NotebookLM在音乐学研究中的范式革命 NotebookLM(由Google Research推出的基于用户上传文档的AI助手)正悄然重塑音乐学研究的方法论边界。它不再依赖通用知识库的模糊匹配&#…...
如何通过虚拟地址查找物理地址
1 如何通过虚拟地址查找物理地址(原理与代码) 本文说明 虚拟地址(VA)到物理地址(PA) 的映射在 x86-64 Linux 上如何理解与实现,并给出可编译的示例代码。不同架构(ARM、RISC-V&#…...
Go代码片段管理工具gocode:提升开发效率的CLI利器
1. 项目概述:一个为Go开发者量身定制的代码片段管理工具如果你和我一样,是个长期和Go语言打交道的开发者,那你肯定遇到过这样的场景:在多个项目间来回切换时,总有一些常用的代码片段——比如一个优雅的错误处理包装函数…...
开源AI本地化框架py-gpt:微内核插件化架构与RAG应用实战
1. 项目概述:一个本地化、可扩展的AI应用框架最近在折腾AI应用本地化部署的朋友,可能都绕不开一个核心矛盾:既想享受大语言模型(LLM)强大的对话和推理能力,又对数据隐私、网络依赖和持续付费心存顾虑。市面…...
开源智能体框架xbrain:模块化设计与工程实践指南
1. 项目概述:一个面向开发者的开源智能体框架最近在开源社区里,一个名为xbrain的项目引起了我的注意。它由开发者yuruotong1发起,定位是一个“开源智能体框架”。简单来说,它试图为开发者提供一个工具箱,让构建、管理和…...
从社交情绪预测到论文分类:DHGNN动态超图模型在两大真实场景下的性能实测与调优心得
动态超图神经网络实战:从社交情绪分析到学术论文分类的双场景深度解析 当面对微博海量用户情绪的实时波动,或是学术文献间错综复杂的引用关系时,传统图神经网络常显捉襟见肘。动态超图神经网络(DHGNN)通过独特的层级动…...
YOLOv8无人机识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)
摘要 针对低空无人机(drone)的检测需求,本文基于YOLOv8目标检测算法构建了一个无人机识别系统。实验采用自建无人机数据集,包含训练集1012张图像、验证集347张图像,类别为单一目标“drone”。模型训练过程中ÿ…...
