应大家要求,先来写写这题的解析(滑稽)
一、题目
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;
}
四、深入研究
依旧没想好(鬼知道哪天会不会想一个蓝玫瑰数出来,滑稽)