C语言——小细节和小知识11

一、自幂数

1、介绍

自幂数,也被称为阿姆斯特朗数,是一种特殊类型的数,在数学上具有一个有趣的性质:一个 n 位的正整数,其各个位上的数字的 n 次幂之和等于它本身。

这里是自幂数的定义步骤:

  1. 确定位数 (n): 首先,要确定一个数是几位数。例如,153 是一个三位数,因此 n = 3

  2. 计算每个位上的数字的 n 次幂:接着,将该数的每个位上的数字取出来,分别计算其 n 次幂。对于 153,计算如下:

    • 1 的三次幂是 1
    • 5 的三次幂是 125
    • 3 的三次幂是 27
  3. 计算这些幂的和:将上一步中得到的所有幂相加。对于 153,其和是 1 + 125 + 27 = 153

  4. 验证和是否等于原数:如果这个总和等于原来的数,则称该数为自幂数。所以,153 是一个自幂数,因为 1^3 + 5^3 + 3^3 = 153

不同位数的自幂数有不同的名称:

  • 三位数的自幂数:这些是最常见的自幂数,通常被称为水仙花数。除了前面提到的 153,还包括 370371 和 407
  • 四位数的自幂数:例如 1634,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634
  • 五位数的自幂数:例如 54748,因为 5^5 + 4^5 + 7^5 + 4^5 + 8^5 = 54748
  • 依此类推,你可以找到更多位数的自幂数。

自幂数不仅局限于三位数,但随着位数的增加,自幂数也变得越来越稀少。自幂数是数学中的一个奇特现象,通常用于编程练习和算术游戏中。在数学理论中,除了被当作一种趣题外,并没有特别的意义。

我们常说的水仙花数就是三位的自幂数。

2、例子

打印0~100000内的自幂数:

#include <stdio.h>
#include <math.h>int CountDigit(int x)//判断数字的位数
{int counter = 0;while (x){x /= 10;counter++;}return counter;
}int main()
{int i = 0,j = 0,s = 0,num = 0;for (i = 0; i <= 100000; i++){num = i;int digits = CountDigit(i);for(s = 0,j = 0;j < digits;j++){s += (int)pow(num % 10, digits);num /= 10;}if (s == i){printf("%d ", i);}}return 0;
}

运行结果:

代码分析:

  1. CountDigit 函数:这个函数的目的是确定一个给定的整数 x 有多少位。它通过一个 while 循环实现:只要 x 不为0,就将 x 除以10,并将计数器 counter 加1。循环结束时,counter 就是 x 的位数。

  2. main 函数

    • 初始化了四个整型变量 ijsnumi 将作为循环变量,j 将在内部循环中使用,s 用于累加幂的和,num 存储 i 的临时副本,防止 i 的值在内部循环中被改变。
    • 外层 for 循环:for (i = 0; i <= 100000; i++),它将从0迭代到100000,检查每个数是否是自幂数。
    • 在每次外层循环的迭代开始时,先将 i 的值赋给 num,然后调用 CountDigit(i) 函数得到当前 i 的位数,这个值存储在 digits 变量中,以便在后续计算中使用。
    • 内层 for 循环:for (s = 0, j = 0; j < digits; j++),用于计算 i 的每一位上的数字的 digits 次幂之和。每次循环:
      • num % 10 提取 num 的最后一位数字。
      • pow(num % 10, digits) 计算这个数字的 digits 次幂。
      • s += ... 将这个幂加到 s 上,s 是一个累加器,用来计算所有幂的和。
      • num /= 10 通过整数除法去除 num 的最后一位数字。
    • 当内层循环结束时,如果 s(幂的和)等于原始的数 i,则表明找到了一个自幂数,printf 函数将其打印出来。

整个程序的执行流程就是对从0到100000的每个整数检查是否为自幂数,并打印出这个范围内所有的自幂数。

二、打印菱形

编写一个程序用来打印菱形:

#include <stdio.h>int main()
{int i = 0, j = 0,n = 0;scanf("%d", &n);//n应当为奇数for (i = 0; i < (n / 2) + 1; i++){for (j = 0; j < (n / 2) - i; j++){printf(" ");}for (j = 0; j < 2 * (i + 1) - 1; j++){printf("*");}printf("\n");}for (i = 0; i < n / 2; i++){for (j = 0; j < i + 1; j++){printf(" ");}for (j = 0; j < n - 2 * (i + 1); j++){printf("*");}printf("\n");}return 0;
}

程序的工作流程如下所述:

  1. 用户输入:程序首先提示用户输入一个整数 n,该值应该是奇数。

  2. 打印菱形的上半部

    • 外层 for 循环从 i = 0 迭代到 i < (n / 2) + 1。该循环负责打印菱形的上半部,包括最中间的一行。
    • 内层第一个 for 循环打印前置空格。对于菱形的每一行,前置空格的数量是 (n / 2) - i,这样星号后面的空格会随着每一行递增的 i 而递减。
    • 内层第二个 for 循环打印星号。每行的星号数量是 2 * (i + 1) - 1,这保证了星号的数量随着每一行递增的 i 而递增,每次增加两个星号(除了第一行)。
    • 每一行打印完星号和前置空格后,printf("\n") 打印一个换行符,以开始新的一行。
  3. 打印菱形的下半部

    • 外层 for 循环从 i = 0 迭代到 i < n / 2。该循环负责打印除了最中间的行以外的菱形下半部分。
    • 内层第一个 for 循环打印前置空格。对于下半部分的每一行,前置空格的数量是 i + 1,这样随着下半部分每一行递增的 i,前置空格也在递增。
    • 内层第二个 for 循环打印星号。每行的星号数量是 n - 2 * (i + 1),这确保了星号的数量随着下半部分每一行递增的 i 而递减,每次减少两个星号。
    • 与上半部一样,每一行打印完星号和前置空格后,printf("\n") 打印一个换行符,以开始新的一行。

最终,当所有循环执行完成时,如果 n 是一个奇数,你将得到一个完整的菱形图案。

这里是一个例子的输出,如果用户输入的 n5

三、买汽水

买汽水,一元一瓶,两个空瓶可以换一瓶汽水,20元可以喝几瓶。

1、循环

#include <stdio.h>int main()
{int money = 0;scanf("%d", &money);int totalBottles = money;int emptyBottles = totalBottles;while (emptyBottles >= 2){int newBottles = emptyBottles / 2;totalBottles += newBottles;emptyBottles = emptyBottles % 2 + newBottles;}printf("%d\n", totalBottles);return 0;
}

程序分析:

  1. 用20元钱买20瓶汽水,所以初始的空瓶数量也是20。
  2. 当你有2个或更多的空瓶时,继续执行循环:
    • 将空瓶数除以2得到新的汽水瓶数(因为2个空瓶可以换1瓶汽水)。
    • 把新的汽水瓶数加到总瓶数上。
    • 更新空瓶的数量,等于之前空瓶数除以2的余数加上新换得的汽水数量。
  3. 当你没有足够的空瓶换取汽水时,循环结束,此时 totalBottles 变量中存储的就是你能喝的汽水总数。
  4. 打印结果。

运行结果:

2、递归

#include <stdio.h>int Func(int totalBottles, int emptyBottles)
{if (emptyBottles < 2){return totalBottles;}int newBottles = emptyBottles / 2;return Func(totalBottles + newBottles, emptyBottles % 2 + newBottles);
}int main()
{int money = 0;scanf("%d", &money);printf("%d\n", Func(money, money));return 0;
}

程序执行的流程大致如下:

  1. 程序启动后,进入main函数,这是每个C程序的入口点。

  2. 程序声明了一个整型变量money,用来存放用户通过标准输入提供的金额。

  3. 程序调用scanf函数等待用户输入一个整数,该整数代表用户用来购买汽水的金额。输入的整数将被保存在money变量中。

  4. 输入完毕后,程序调用Func函数,将money作为参数传入,这里有两个作用:一是表示初始时用这些钱可以直接买到的汽水数量,二是同样数量的空瓶可以开始进行换购。

  5. Func函数内部,首先检查当前的空瓶数量是否足够兑换更多的汽水。如果不足2个,则无法继续兑换,函数返回当前统计到的汽水总瓶数。

  6. 如果当前空瓶数量足够换更多汽水(即2个或2个以上),则计算能够兑换的新汽水瓶数,并更新空瓶数量(包括兑换后剩余的空瓶和新的空瓶)。

  7. Func利用递归调用自身,将更新后的汽水总数和空瓶数量作为新的参数,继续上述兑换过程。

  8. emptyBottles不再足以兑换新的汽水时,递归结束,Func函数返回最终计算的汽水总瓶数。

  9. main函数接收到Func函数返回的总瓶数后,通过printf函数输出到控制台。

  10. 最后,main函数执行完毕,返回0,标志着程序的正常结束。

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows ssh登录eNSP交换机

目录 1. Cloud IO配置1.1 创建UDP端口1.2 创建本地连接1.3 端口映射设置 2. 交换机配置2.1 配置vlanif2.2 配置vty2.3 配置ssh用户2.4 配置aaa2.5 使用Xshell工具登录2.6 用户和密码2.7 登录成功 3. 使用cmd 登录报错提示3.1 手动指定加密算法&#xff0c;提示密码长度无效3.2 …

Softmax函数介绍

Softmax函数是一种常用的激活函数&#xff0c;用于将一组实数值转换为概率分布。它常用于多类别分类问题中&#xff0c;将输入向量映射为各个类别的概率。 Softmax函数的公式如下&#xff1a; 其中&#xff0c;示输入向量的第 &#xfffd;i 个元素&#xff0c;&#xfffd;n …

【JVM】JVM概述

JVM概述 基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;即 Java 虚拟机&#xff0c;一种规范&#xff0c;本身是一个虚拟计算机&#xff0c;直接和操作系统进行交互&#xff0c;与硬件不直接交互&#xff0c;而操作系统可以帮我们完成和硬件进行交互的工作特…

SpringBoot整理-Spring Boot与Spring MVC的区别

Spring Boot 和 Spring MVC 是 Spring 框架的两个不同部分,它们在 Java Web 开发中扮演着各自独特的角色。理解它们之间的区别有助于更好地利用 Spring 生态系统进行有效的应用开发。 Spring MVC 定义: Spring MVC 是基于 Model-View-Controller(模型-视图-控制器)设计模式的…

红队渗透靶机:TOPPO: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 5、dirsearch WEB tips1 tips2 SSH登录 提权 系统信息收集 本地 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110…

Linux第33步_TF-A移植的第1步_创建新的设备树

TF-A移植第1步就是创建新的设备树&#xff0c;并命名为“stm32mp157d-atk”。 和“TF-A移植”有关的知识点&#xff1a; 1)设备树英文名字叫做Device tree&#xff0c;用来描述板子硬件信息的&#xff0c;比如开发板上的 CPU有几个核 、每个CPU核主频是多少&#xff0c;IIC、…

单元测试、模块测试、web接口测试

单元测试与模块测试 什么是“单元测试”、“模块测试”&#xff1f; 然而在功能的实现代码中并没有“单元”&#xff0c;也没有“模块”&#xff1b;只有函数、类和方法。先来分别看看它们 的定义&#xff1a; 单元测试&#xff08;Unit testing&#xff09;&#xff0c;是指…

代码随想录算法训练营第三天 | 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

链表理论基础 链表是一种通过指针串连在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域&#xff0c;一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;。最后一个节点的指针指向 null。链表的存储方式&#xff1a;数组在内存中是连续…

带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍

Hqst华轩盛(石门盈盛)电子导读&#xff1a;一起来了解带POE网络变压器与2.5G/5G/10G网络变压器产品特点&#xff1f; 一﹑带POE网络变压器与2.5G/5G/10G网络变压器产品特点介绍 首先、POE网络变压器产品与常规不带POE产品的区别&#xff1a; 带POE网络变压器主要要求是耐电流等…

R语言【cli】——ansi_toupper(),ansi_tolower():将ANSI彩色字符串全部大写或小写

Package cli version 3.6.0 Usage ansi_toupper(x)ansi_tolower(x)ansi_chartr(old, new, x) Arguments 参数【x】&#xff1a;输入字符串。可能有ANSI的颜色和样式。 参数【old】&#xff1a;指定要翻译的字符的字符串。如果提供长度为2或更多的字符向量&#xff0c;则使用…

(二)CarPlay集成开发之苹果的iAP协议

文章目录 概要协议格式鉴权流程CarPlay中的iAP2协议应用小结 概要 iAP2协议是由苹果公司定义的一种数据通信协议&#xff0c;主要用于苹果设备认证外设&#xff0c;以及与外设数据交换的一种协议 协议格式 协议格式一共分为三种类型&#xff0c;分别为握手包&#xff0c;链路…

【日常踩坑】解决 kex_exchange_identification 报错

文章目录 踩坑原因分析解决办法1. 临时关闭代理2. 修改代理软件配置&#xff0c;22 端口走直连3. 改用 HTTPS 协议&#xff0c;走 443 端口 参考资料 踩坑 最近在使用 git 时&#xff0c;发现 git pull 时经常会出现下面的报错 kex_exchange_identification: Connection close…

42.接雨水 - 力扣(LeetCode)

问题描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。输入格式 height [0,1,0,2,1,0,1,3,2,1,2,1]输出格式 6解释 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下…

「优选算法刷题」:查找总价格为目标值的两个商品

一、题目 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, 15], target 18 输出&#xff1a;[3,15] 或者 [15,3]示例…

ARM_Linux的NFS网络文件系统的搭建

介绍&#xff1a; NFS是network filesystem的简称&#xff0c;可以不同的主机通过网络访问远端的NFS服务器共享出来的文件&#xff0c;这样主机通过网络访问NFS服务器&#xff0c;我们就可以在开发板上通过网络访问主机的文件。 为什么要使用NFS网络文件呐&#xff1f; 1、传…

初始RabbitMQ(入门篇)

消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…

【2023】java使用WebClient实现chatGPT调用建立web socket连接

&#x1f4bb;目录 一、介绍1、使用技术2、效果 二、代码1、前端代码2、后端代码2.1、maven依赖2.2、model2.2.1、请求接口的格式2.2.2、响应数据对象 2.3、工具类2.3.1、&#x1f534;使用WebClient调用chatgpt方法2.3.2、&#x1f7e0; webSocket连接对话方法 2.4、Controlle…

使用 OpenLLM 构建和部署大模型应用

原文&#xff1a;使用 OpenLLM 构建和部署大模型应用 - 知乎 分享主题为&#xff1a;使用 OpenLLM 快速构建和部署大语言模型的应用。OpenLLM 是一个开源的大语言模型&#xff08;LLM&#xff09;开发框架。它支持多种开源的 LLM 模型&#xff0c;并且具有内建的两个关键的 LL…

自然语言处理研究的内容

一.基础技术 1.1 词法分析 词法分析&#xff08;Lexical Analysis&#xff09;&#xff0c;也称为词法扫描或扫描器&#xff0c;是自然语言处理&#xff08;NLP&#xff09;中的基础步骤之一&#xff0c;用于将输入的文本分割成词法单元&#xff08;Token&#xff09;。词法单…

【更新中】Python 学习资料列表

由于学习 Python 的时候我手上并没有一本比较全面的书&#xff0c;所以一切都是从网上进行学习。正因如此&#xff0c;未来在想重新看看某些相关内容的时候就找不到或者记不得从哪看的了&#xff0c;所以这里记录下一些我觉得未来可能会重新查看的网页或网站。 由于我使用 Pyt…