iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

C++30日挑戰之旅系列 第 6

DAY6 質數判斷與for迴圈

  • 分享至 

  • xImage
  •  

題目:

讓使用者輸入一個整數,並輸出該數是否為質數


解法:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
     int x, a = 0, b = 0; //a=非質數;b=質數;
     cin >> x;//待檢查數

     if(x==0||x==1)
     {
          cout << "不是質數" << endl;
     }
     else
     {
          for (int i = 2; i < sqrt(x);i++)
          {
               if(x%i == 0)
               {
                    a++;//代表有除了1的因數,且是此i值
               }
               else if(x%i != 0)
               {
                    b++;//代表此i值不是x的因數
               }
          }
     }

     if(a>=1)
     {
          cout << "不是質數" << endl;
     }
     else
     {
          cout << "是質數" << endl;
     }
     
}

解釋與詳細介紹

第一部分:for迴圈介紹

//initial expression
for(cond-expression)
{
//loop-expression
}

for迴圈是程式中很常出現的一個語法,通常在for前面會出現代表這個迴圈的初始設定,本題就是當程式執行到else內部才會開始執行for,而在括號中的cond-expression則代表了執行loop-expression的條件,當其為true時才會執行loop,舉例而言

for(int i = 0; i < 2; i++ )
{
    cout << i;
}

這個程式中的判斷標準變是以"當下的變數i"是否小於二去執行cout<<i"的指令與次數。因此在程式執行時,依序在

i=0,因為此時的i=0 < 2,因此他會先印出"0",而後進行了i++也可寫作i=i+1,代表i值增加1
i=1,因為此時的i=1 < 2,因此他會印出"1"而後進行了i++
i=2,因為此時的i=2 !< 2,!代表"不"的意思,因此他會結束這個loop且不會印出任何東西

所以這段程式的結果便會呈現"01"。

我們很常運用for loop配合if else、while與其他迴圈去實現我們想執行的程式邏輯。

第二部分:主功能解析

由題目可得知

input:為一個整數值
output:呈現他是否為"質數"的結果,這裡我們用string(字串)的方式印出成果

我們先另x=輸入數,a,b分別作為其為"非質數"與"質數"的代表。並用第一個if條件將x=0和1的情形排除,並在else的條件中逐一判定i由2~(根號x)-1的範圍內是否有出現"任何一次"i為x因數的情況(因為質數定義為因數只有自己和1),若是有,則代表他不是質數,那就會使代表"是此i的倍數"="非質數"的a++;否之則會使代表"不是此i的倍數"的b++,並一直重複這個過程到結束。最後再由a的值來判斷便可以得出結論。

**小技巧:**因為其最大質因數必不會超過本身開根號的答案,加上這個條件可以有效降低程式的時間複雜度,也就是使執行效率更快

第三部分:成果展示

https://ithelp.ithome.com.tw/upload/images/20220907/20151593MHLbY6kwXZ.png


參考資料:

  1. https://docs.microsoft.com/zh-tw/cpp/cpp/for-statement-cpp?view=msvc-170

上一篇
DAY5 if/else與星座的愛恨情仇
下一篇
DAY7用srand()與swich/case做出撲克牌發牌機
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言