首页 > 编程语言 >编码探索:卡布列克常数的算法之旅

编码探索:卡布列克常数的算法之旅

时间:2024-09-25 18:50:31浏览次数:3  
标签:编码 之旅 temp min int newNumber 卡布列 1000

数字的魔法:给我任意一个四位数,通过排列和减法,最终总能得到6174——卡布列克常数。本文用代码演示了这一神奇过程,带你领略数学的奇妙和编程的乐趣。


卡布列克常数(Kablek constant):任意一个不是由完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。

设计思想:递归

函数设计思路

  1. 合法性判断: a) 判断是否为4位数字,不是则补高位 0 b) 判断该 4 位数是否为包含至少 2 种不同数字
  2. 将这4位数进行组合,得到 a.可组成的最大数 b.可组成的最小数 a) 组合思路: i. 建立数组 ii.对数组进行从大到小的排序 iii.将数组正序取出,则为 max。逆序取出,则为 min
  3. 用 max - min 得到 newNumber
  4. 判断 newNumber 是否为 6174 a) 若不是,则开始递归,返回步骤1 b) 若是,则表明此数是卡布列克常数。即跳出循环,记录并输入它的原始数字

代码实现

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>

#define START 1000
#define END 9999

void SortArr(int* p, int sz)
{
	//合法性检查
	assert(p);

	int i = 0;
	int j = 0;
	int temp = 0;

	for (i = 0; i < sz - 1; i++)
	{
		for (j = 0; j < sz - i - 1; j++)
		{
			if (*(p + j) < *(p + j + 1))
			{
				temp = *(p + j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
}

bool IsKablek(int x)
{
	//合法性判断
	if (x > 9999)
	{
		return false;
	}

	int newNumber = 0;
	int temp[4] = { 0 };
	int sz = 0;

	int max = 0;
	int min = 0;

	//取所有位数
	if (x > 1000)
	{
		temp[0] = x / 1000;
	}
	if (x > 100)
	{
		temp[1] = x % 1000 / 100;
	}
	if (x > 10)
	{
		temp[2] = x % 100 / 10;
	}
	if (x > 0)
	{
		temp[3] = x % 10;
	}
	
  //所有数字相同的,不符合卡布列克常数定义,直接返回false
	if (temp[0] == temp[1] && temp[1] == temp[2] && temp[2] == temp[3])
	{
		return false;
	}

	//排序
	sz = sizeof(temp) / sizeof(int);
	SortArr(temp, sz);
	
  //将数组正序取出,赋值给为max。
  //逆序取出,赋值为min
	max = (temp[0] * 1000) + (temp[1] * 100) + (temp[2] * 10) + temp[3];
	min = (temp[3] * 1000) + (temp[2] * 100) + (temp[1] * 10) + temp[0];
	
  //得到新数字
	newNumber = max - min;

	if (newNumber == 6174)
	{
		return true;
	}
	else
	{
    //进入递归
		return IsKablek(newNumber);
	}
}

int main()
{
	int i = 0;
	int count = 0;//记录卡布列克常数在4位数中的数量
	bool flag = false;

	//遍历所有4位数
	for (i = START; i <= END; i++)
	{
		//判断是否为卡布列克常数,若是,则输出
		flag = IsKablek(i);
		if (flag)
		{
			//printf("%d ", i);
			count++;
		}
	}

	printf("\n所有4位数中,符合卡布列克常数的数,共有 %d 个\n", count);

	return 0;
}

运行结果

编码探索:卡布列克常数的算法之旅_#include

验算完毕,输出结果为8990,代表所有4位数中,除去9个所有位数字都相等的(因为这9个数字:1111,2222,...,9999,不管怎么排列,都会在第一次相减时,得到0),确实都为卡布列克常数。

标签:编码,之旅,temp,min,int,newNumber,卡布列,1000
From: https://blog.51cto.com/xuwenda/12111598

相关文章

  • <<编码>> 第 17 章 自动操作(3)--带控制器的自动加法器 示例电路
    info::操作说明操作说明:计数器处,因16位过于庞大,这里只使用5位代替首先按左边的清零.接着可以自行使用TO置高位并手动更改地址的值检查代码及数据的值(可选,这些值已提前置入)完毕后确保已将两TO值置为低位.之后,单击手动瞬时开关模拟时钟信号驱动计......
  • Python中的文件编码:揭开字符世界的神秘面纱
    引言在计算机系统中,数据是以二进制形式存储的。而我们日常见到的文字、符号等信息,则需要通过特定的方式转化为二进制数据,这就是编码的过程。不同的编码方式决定了如何将字符映射成字节序列。选择合适的编码方案不仅能够保证信息传输的准确性,还能提高程序的兼容性和可移植性。比如,......
  • 旋转位置编码
    参考自RoPE旋转位置编码深度解析:理论推导、代码实现、长度外推-知乎(zhihu.com)位置编码:1.绝对,直接加到输入中.2.相对,加在Attn的内积之前,外推性能强。 ROPE:对Attn的K和V矩阵做ROPE二维场景: 对于一个二维向量: 偶数维的可以用拆成若干个2维的向量,对这些向量分......
  • Nat Genet | 发现8个新基因!外显子组测序揭示罕见编码基因突变对成人认知功能的影响
    认知功能是一种复杂的心理过程,包括注意力、记忆力、处理速度、空间能力、语言和解决问题的能力,很难单独评估。已有研究表明,成人认知功能受到遗传的强烈影响。基于常见变异的全基因组关联研究(GWAS),目前已经确定了近4000个个体效应较小的认知功能基因位点。同时,GWAS还证明了认知功能和......
  • 【代数与编码】域的概念
    什么是域?温故群:一个集合G,一种二元运算∗,满足群公理(封闭,结合,单位元,逆元)。阿贝尔群(交换群):任意a,b∈G,a∗b=b∗a。(交换律)环:一个集合R,两种二元运算加法和乘法(+,·),满足(加法构成阿贝尔群,乘法构成半群,分配律)。含幺环(单位环):环,乘法单位元。交换环:环,乘法交换律。含幺交换环:环,乘......
  • MISC - 第四天(OOK编码,audacity音频工具,摩斯电码,D盾,盲文识别,vmdk文件压缩)
    前言各位师傅大家好,我是qmx_07,今天继续讲解MISC知识点FLAG附件是一张图片,尝试binwalk无果使用StegSolve工具DataExtract查看时发现PK字段,是大多数压缩包的文件头点击SaveBin保存zip文件解压缩失败使用修复软件:http://forspeed.onlinedown.net/down/95222_201706......
  • 数据飞轮的演进:社交行业的技术变革之旅
    在数据驱动的时代,理解并运用先进的技术是社交行业持续增长的关键因素。从数据仓库、数据湖到数据中台,再到现在所提倡的“数据飞轮”理念,每一个技术的进步都对社交平台的业务增长、用户行为分析以及日常运营活动产生了深远影响。本文将从技术的视角,结合社交行业的具体应用场景,探讨这......
  • threejs 使用base64编码的图片作为贴图
     使用base64作为贴图可以从接口直接传输(如果特别大需要压缩),可以省去很多操作 代码如下//纹理加载器consttexLoader=newTHREE.TextureLoader();constbase64Str="data:image/png;base64,...";texLoader.load(base64Str,(texture)=>{constaspectRa......
  • “MBTI大揭秘:探索十个人格维度的脑洞之旅“
    类型指标美国的凯恩琳·布里格斯和她的女儿伊莎贝尔·布里格斯·迈尔斯研制了迈尔斯-布里格斯类型指标(MBTI)。这个指标以瑞士心理学家卡尔·荣格对人格划分的8种类型为基础,加以扩展,形成四个维度.四个维度如同四把标尺,每个人的性格都会落在标尺的某个点上,这个点靠近那个端点,就......
  • 备战软考02——硬件组成,CPU,编码,浮点数
    计算机硬件组计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成运算器、控制器等部件被集成在一起统称为中央处理单元(CentralProcessingUnit,CPU)。CPU是硬件系统的核心,用于数据的加工处理,能完成各种算术、逻辑运算及控制功能。◆存储器是计算机系......