1. 程式人生 > >廈理OJ——1008:3_7紅玫瑰數

廈理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;
}

四、深入研究

依舊沒想好(鬼知道哪天會不會想一個藍玫瑰數出來,滑稽)