C语言求取完数-程序详解(1-1000以内,谭浩强C语言5-9习题)

2024-03-16 09:30

本文主要是介绍C语言求取完数-程序详解(1-1000以内,谭浩强C语言5-9习题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录:

1.1:程序实现的要求:

1.2、 程序主体思路:

1.3、代码详解:

前言:该文章讲解一个程序,功能是对完数的判断和对完数因子的输出,对应于《C语言程序设计》谭浩强第四版第五章第9题。因博主能力水平有限,若程序或者讲解有误,请各位多指正建议。

1.1:程序实现的要求:

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:6 its factors are 1,2,3

1.2、 程序主体思路:

 求取完数可以尝试用一个函数实现,该函数可以用一个返回值来表示它是否是完数(返回值1表示该数是完数,返回值为0则不是完数)。求取因子,可以往该函数里传入一个一维数组,该数组可以存储一个数的因子,每次传入新的数时,对该数组进行初始化。此外可在主函数之中对显示该数组的元素,即可显示完数和完数的因子。

1.3、代码详解:

求取完数的函数int GetPerNum(int n,int arr[100]):函数的返回值类型是int型,传入的参数有两个,一个传入的数,类型是int型,一个是数组,用于存储数的因子,数组元素的类型是int型。

int GetPerNum(int n,int arr[100])//求取完数的函数,数组存储完数的因子
{int i = 0;int sum = 0;//因子的和int j = 0;for (i = 1; i <= n/2; i++)//一个数的最大因子(不包括本身)到n/2;也可设置到n-1;{if (n % i == 0)//如果是i是n的因子{sum = sum + i;//将因子相加arr[j] = i;//将相应的因子存储到数组中j++;}}if (sum == n)//数的因子和等于该数{return 1;//是完数返回1}return 0;//不是完数返回0
}

主函数:主函数定义了一个一维数组arr,该数组里有100 个元素,保证能够存储一个数的所有因子。当然,也可以将数组的元素减小一些,如20个;主函数还定义了一个i,i是为了产生1-1000的数。还定义了一个j,是为了遍历arr数组。

在主函数中,通过一个for循环来产生1-1000的数,首先对arr数组进行初始化,数组里的所有元素初始化为0;之后通过调用GetPerNum函数,判断一个数是否为完数;如果为完数,打印该数,并且遍历该数组,打印所有不为0的元素,遇到0元素时,换行,并且跳过内部的一个for循环(主函数里有两个for循环,跳出的是for (j = 0; j <= 100; j++))。

int main()
{int i = 0;int j = 0;//printf("完数是以下几个数\n");//可以将该语句屏蔽,输出窗口就不显示“完数是以下几个数”for (i = 1; i <= 1000; i++)//获取1-1000的数{int arr[100] = { 0 };//每次都会初始化一下数组,数组里设置100个元素,是为了保证数组容量足够;也可设置20个元素;if (GetPerNum(i, arr) == 1)//如果该数是完数,是完数的话,GetPerNum函数返回值为1{printf("%d ", i);//打印该完数printf("its factors are");for (j = 0; j <= 100; j++)//遍历arr数组的元素{if (arr[j] != 0 )//元素不为0的元素打印{printf("%d", arr[j]);if (arr[j + 1] != 0)//最后一个因子后面不打印“,”{printf(",");}}else//元素为0时,从此元素开始,后面的元素都为0,都不需要打印了{printf("\n");//换行break;//此时跳过内部循环}}}}return 0;
}

输出显示:

1.3、程序代码:

#include <stdio.h>
int GetPerNum(int n,int arr[100])//求取完数的函数,数组存储完数的因子
{int i = 0;int sum = 0;//因子的和int j = 0;for (i = 1; i <= n/2; i++)//一个数的最大因子(不包括本身)到n/2;也可设置到n-1;{if (n % i == 0)//如果是i是n的因子{sum = sum + i;//将因子相加arr[j] = i;//将相应的因子存储到数组中j++;}}if (sum == n)//数的因子和等于该数{return 1;//是完数返回1}return 0;//不是完数返回0
}int main()
{int i = 0;int j = 0;//printf("完数是以下几个数\n");//可以将该语句屏蔽,输出窗口就不显示“完数是以下几个数”for (i = 1; i <= 1000; i++)//获取1-1000的数{int arr[100] = { 0 };//每次都会初始化一下数组,数组里设置100个元素,是为了保证数组容量足够;也可设置20个元素;if (GetPerNum(i, arr) == 1)//如果该数是完数,是完数的话,GetPerNum函数返回值为1{printf("%d ", i);//打印该完数printf("its factors are");for (j = 0; j <= 100; j++)//遍历arr数组的元素{if (arr[j] != 0 )//元素不为0的元素打印{printf("%d", arr[j]);if (arr[j + 1] != 0)//最后一个因子后面不打印“,”{printf(",");}}else//元素为0时,从此元素开始,后面的元素都为0,都不需要打印了{printf("\n");//换行break;//此时跳过内部循环}}}}return 0;
}

这篇关于C语言求取完数-程序详解(1-1000以内,谭浩强C语言5-9习题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815041

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用