厦理OJ——1008:3_7红玫瑰数

应大家要求,先来写写这题的解析(滑稽)

一、题目

Description

若正整数N的所有因子之和等于N的倍数,则称N为红玫瑰数,如28的因子之和为1+2+4+7+14+28=56=28*2,故28是红玫瑰数,求: 
(1)[1,700]之间最大的红玫瑰数。 
(2)[1,700]之间有多少个红玫瑰数。 

Input

Output

第一行输出一个整数,代表[1,700]之间最大的红玫瑰数。 
第二行输出一个整数,代表[1,700]之间有多少个红玫瑰数。 
第三行从小到大输出[1,700]之间的所有红玫瑰数,每两个数之间用空格隔开。

Sample Input

Sample Output

672
6
1,,,,

二、解析

本题的思路就是一次循环判断1到700之间的每一个数是否为红玫瑰数,并用相应变量保存红玫瑰数个数、最大红玫瑰数以及所有的红玫瑰数,于是可以得到如下代码。(注:Is_roseNum()为函数,功能是判断一个数字是否为红玫瑰数,具体实现在下面讲)

int total = 0, rose_max = 0;    //用于储存总数和最大红玫瑰数
int rose[700];                  //用于储存所有红玫瑰数
for (int i = 1; i <= 700; i++)  //1到700循环判断是否为红玫瑰数
{
	if (Is_roseNum(i))          //IS_roseNum()为判断i是否为红玫瑰数的函数
	{
		rose[total] = i;
		total++;
		rose_max = i;
	}
}

 有了这个大体框架后接下来就是要完成其中的一些模块,如Is_roseNum()函数(可以算是这题核心吧QAQ),根据题目对红玫瑰数的定义我们可以对该函数进行编写。因数(不懂定义的小盆友,度娘了解一下)的判断只需要判断一个数能否被一个数整除,即N%i==0(i为需要判断是否为N的因数的一个数),倍数就不用多说了,取模(%)大法好!!!

//判断是否为红玫瑰数
bool Is_roseNum(int n)
{
	int sum = 0;                    //用于储存因数之和
	for (int i = 1; i <= n; i++)    //寻找1到n中n的因数并求和
	{
		if (!(n%i))
		{
			sum += i;
		}
	}

	if (!(sum%n))                    //根据定义,判断因数和是否为n的整数倍
		return true;    //若是,则返回真
	return false;       //若不是,则返回假
}

 关于函数:若还没学到函数,可以将函数内容放进main()函数内,不过这样main()函数看起来冗长,可读性下降

最后我们只要对函数输出部分进行添加即可,下面放出AC源码

三、源码

#include <iostream>

using namespace std;
/************以上为c++头部,C语言自行包含相关头文件************/

bool Is_roseNum(int i);//函数不要忘记声明

int main()
{
	int total = 0, rose_max = 0;
	int rose[700];
	for (int i = 1; i <= 700; i++)
	{
		if (Is_roseNum(i))
		{
			rose[total] = i;
			total++;
			rose_max = i;
		}
	}
    //c++输出,C语言使用pringf() 形式不变
	cout << rose_max << endl;
	cout << total << endl;
	for (int i = 0; i < total; i++)
		cout << rose[i] << " ";

	return 0;
}


//判断是否为红玫瑰数
bool Is_roseNum(int n)
{
	int sum = 0;
	for (int i = 1; i <= n; i++)
	{
		if (!(n%i))
		{
			sum += i;
		}
	}

	if (!(sum%n))
	{
		return true;
	}
	else
		return false;
}

四、深入研究

依旧没想好(鬼知道哪天会不会想一个蓝玫瑰数出来,滑稽)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值