廈理OJ——1008:3_7紅玫瑰數
阿新 • • 發佈:2018-11-15
應大家要求,先來寫寫這題的解析(滑稽)
一、題目
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;
}
四、深入研究
依舊沒想好(鬼知道哪天會不會想一個藍玫瑰數出來,滑稽)