C語言程式設計100例之(5):分解質因數

来源:https://www.cnblogs.com/cs-whut/archive/2019/11/15/11863839.html
-Advertisement-
Play Games

例5 分解質因數 題目描述 將一個正整數分解質因數。例如:輸入90,輸出 90=2*3*3*5。 輸入 輸入數據包含多行,每行是一個正整數n (1<n <100000) 。 輸出 對於每個整數n將其分解質因數。 輸入樣例 90 256 199 輸出樣例 90=2*3*3*5 256=2*2*2*2* ...


例5    分解質因數

題目描述

將一個正整數分解質因數。例如:輸入90,輸出 90=2*3*3*5。

輸入

輸入數據包含多行,每行是一個正整數n (1<n <100000) 。

輸出

對於每個整數n將其分解質因數。

輸入樣例

90

256

199

輸出樣例

90=2*3*3*5

256=2*2*2*2*2*2*2*2

199=199

        (1)編程思路。

對整數n進行分解質因數,應讓變數i等於最小的質數2,然後按下述步驟完成:

1)如果i恰等於n,則說明分解質因數的過程已經結束,輸出即可。

2)如果n<>i,但n能被i整除,則應輸出i的值,並用n除以i的商,作為新的正整數n,轉第1)步。

3)如果n不能被i整除,則用i+1作為新的i值,轉第1)步。

因此,程式主體是一個迴圈,在迴圈中根據n能否整除i,進行兩種不同處理,描述為:

        i=2;

       while(i<n)

       {

            if(n%i==0)

            {

                       printf("%d*",i)     // i是n的因數,輸出i

                       n=n/i;            // 對除以因數後的商在進行分解

            }

           else

                  i++;             // 找下一個因數

      }

        (2)源程式。

#include <stdio.h>

int main()

{

   int n,i;

   while (scanf("%d",&n)!=EOF)

   {

        printf("%d=",n);

        i=2;

        while(i<n)

        {

            if(n%i==0)

            {

                printf("%d*",i);

                n=n/i;

           }

           else

                i++;

        }

        printf("%d\n",n);

   }

   return 0;

}

習題5

5-1  完全數

題目描述

完全數(Perfect number)又稱完美數或完備數,是一些特殊的自然數。它所有的真因數(即除了自身以外的約數)的和,恰好等於它本身。

例如:第一個完全數是6,它有約數1、2、3、6,除去它本身6外,其餘3個數相加,1+2+3=6。第二個完全數是28,它有約數1、2、4、7、14、28,除去它本身28外,其餘5個數相加,1+2+4+7+14=28。

編寫一個程式,求兩個正整數之間完全數的個數。

輸入

輸入數據包含多行,第一行是一個正整數n,表示測試實例的個數,然後就是n個測試實例,每個實例占一行,由兩個正整數num1和num2組成,(1<num1,num2<10000) 。

輸出

對於每組測試數據,請輸出num1和num2之間(包括num1和num2)存在的完全數個數。

輸入樣例

2

2 5

5 7

輸出樣例

0

1

         (1)編程思路。

        要求num1和num2之間的所有完全數,需要對num1~num2範圍內的每一個數n,計算n的所有真因數之和s,若n==s,則n就是一個完全數。框架描述為:

         for(n=num1;n<=num2;n++)

         {

                   計算n的真因數之和s ;

                   if(s==n)

                            是完全數,計數;

         }

        為計算n的所有真因數之和s,可令s初值為1(1是n的真因數),然後用2~n-1範圍內的每個i去除n,如果n能被i整除(即n%i==0),則i是n的真因數,s=s+i。

        實際上,i(i>1)是n的真因數,則n/i也是n的真因數。因此,可以將i的範圍縮小為2~sqrt(n)。這樣,計算n的真因數之和s的操作描述為:

                   s=1;                                                // s為n的真因數之和

                   for(i=2;i<=sqrt(n);i++)                // 求解真因數之和

                            if(n%i==0)

                                     if (i!=n/i)  s=s+i+n/i;

                else  s=s+i;

        因此,程式可以寫成一個嵌套的二重迴圈。

       (2)源程式。

#include <stdio.h>

#include <math.h>

int main()

{

         int t,num1,num2,i,n,s,cnt;

         scanf("%d",&t);

        while (t--)

        {

            scanf("%d%d",&num1,&num2);

            cnt=0;

            if (num1>num2) { n=num1; num1=num2; num2=n;}

             for(n=num1;n<=num2;n++)

             {

                       s=1;                                                // s為n的真因數之和

                       for(i=2;i<=sqrt(n);i++)                // 求解真因數之和

                               if(n%i==0)

                                {

                                         if (i!=n/i)  s=s+i+n/i;

                                         else  s=s+i;

                                 }

                       if(s==n)  cnt++;

            }

            printf("%d\n",cnt);

      }

      return 0;

}

5-2  親和數

題目描述

遙遠的古代,人們發現某些自然數之間有特殊的關係:如果兩個數a和b(a不等於b),a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a、b是一對親和數。

例如220和284,1184和1210,2620和2924,5020和5564,6232和6368。

給定一個正整數 S(6≤S≤18000) ,找出a,b兩數中至少有一個不小於S的第一對“親和數” 。

輸入格式

一行一個整數S。

輸出格式

一行兩個整數A 和 B(用空格隔開)。A 表示第一個不小於 S 的有“親和數”的整數,B是A的“親和數”。

輸入樣例 #1

206

輸出樣例 #1

220  284

輸入樣例 #2

260

輸出樣例 #2

284  220

        (1)編程思路。

        程式對輸入整數begin開始的自然數進行窮舉,演算法描述為:

         for(n=begin;;n++)

         {

                   計算n的真因數之和 s ;

                   if (s==n) continue;

                   計算s的真因數之和 m ;

                   if(m==n)                        // 如果兩數相等,是解

                   {

                          輸出解的情況;

                   }

         }

        計算自然數的真因數之和的方法,可以參見前面的習題5-1“完全數”。

       (2)源程式。

#include <stdio.h>

#include <math.h>

int main()

{

         int begin,i,n,s,m,k;

         scanf("%d",&begin);

         for(n=begin;;n++)

         {

                   s=1;                                                   // s為n的真因數之和

                   k=1;                                                  // k為n的真因數個數

                   for(i=2;i<=(int)sqrt(1.0*n);i++)          // 求解真因數之和

                            if(n%i==0)

                            {

                                     s=s+i+n/i;

                                     k+=2;

                            }

                  i--;

                  if (i*i==n) s-=i;

                  if(k==1 || s==n)                                    // 若n為質數或完數,進行下次迴圈

                            continue;

                   m=1;                                                   // m為s的真因數之和

                   for(i=2;i<=(int)sqrt(1.0*s);i++)

                            if(s%i==0)

                                     m+=i+s/i;                       // 計算s的真因數之和

                   i--;

                   if (i*i==s)  m-=i;

                   if(m==n)                                      // 如果兩數相等,輸出親和數

                   {

                            printf("%d %d\n",n,s);

                            break;

                   }

       }

       return 0;

}

5-3  The number of divisors about Humble Numbers

Problem Description

A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers.

Now given a humble number, please write a program to calculate the number of divisors about this humble number.For examle, 4 is a humble,and it have 3 divisors(1,2,4);12 have 6 divisors.

Input

The input consists of multiple test cases. Each test case consists of one humble number n,and n is in the range of 64-bits signed integer. Input is terminated by a value of zero for n.

Output

For each test case, output its divisor number, one line per case.

Sample Input

4

12

0

Sample Output

3

6

       (1)編程思路。

        若一個大於1正整數n可以分解質因數:n=(p1^a1)*(p2^a2)*(p3^a3)*…*(pk^ak),

        則由約數個數定理可知n的正約數有 (a1+1)(a2+1)(a3+1)…(ak+1)個。

        本題要求一個給定醜數n的約數個數,而一個醜數分解質因數後,其質因數只有2、3、5或7這4個,因此只需求出n中分別含有質因數2、3、5和7的個數即可。

        (2)源程式。

#include <stdio.h>

int fun(__int64 n,int x)    // 求整數n分解質因數後含質因數x的個數

{        int sum=0;

         while(n%x==0)

         {

                   sum++;

                   n/=x;

         }

         return sum;

}

int main()

{

         int cnt1,cnt2,cnt3,cnt4;

         __int64 n;

         while(scanf("%I64d",&n) && n!=0)

         {

                   cnt1=cnt2=cnt3=cnt4=1;

                   cnt1+=fun(n,2);

                   cnt2+=fun(n,3);

                   cnt3+=fun(n,5);

                   cnt4+=fun(n,7);

                   printf("%d\n",cnt1*cnt2*cnt3*cnt4);

         }

         return 0;

}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue中添加滾動載入更多,因為是單頁面所以需要在跳出頁面時候銷毀滾動,要不會出現錯亂。我們在mounted建立滾動,destroyed銷毀滾動。 mounted () { window.addEventListener('scroll', this.handleScroll) }, destroye ...
  • 2d x y 3d x y z 左手坐標系 伸出左手,讓拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方。這樣我們就建立了一個左手坐標系,拇指、食指和中指分別代表X、Y、Z軸的正方向。如下圖 CSS3中的3D坐標系與上述的3D坐標系是有一定區別的,相當於其繞著X軸旋轉了180度,如下圖 簡單 ...
  • 現在很多網站會用到進入網站特效,到網頁沒有載入完成的時候,會有一個loding特效,載入完了之後才能看到頁面,今天就帶著做一個js進度條效果,今天要做的效果是純js進度條載入,沒有用到框架,方便大家進行深入理解: 首先我們要進行js進度條的佈局 js進度條佈局如下: 1234567891011121 ...
  • 網路請求編碼表示會從你是否關註Request head的哪些內容入手,一般關註點放在statusCode和method上就夠用,重點200,304。同時掌握了基礎後希望註意的點為文件上傳的內容(百度問過斷點續傳的實現) 200: ‘伺服器成功返回請求的數據。’,201: ‘新建或修改數據成功。’,2 ...
  • 一.起因 我在做爬蟲的時候發現很多網站上都在url上加一個 一開始我以為是啥加密後面發現其實他在後臺解析的時候也不需要 ,那他加個隨機數是做啥子 二.查看文獻得到總結 常用修改url方式 ...
  • transform是CSS3中具有顛覆性的特征之一,可以實現元素的位移、旋轉、傾斜、縮放,甚至支持矩陣方式,配合過渡和即將學習的動畫知識,可以取代大量之前只能靠Flash才可以實現的效果。 變形轉換 transform transform 變換 變形的意思 《 transformers 變形金剛》 ...
  • 對於DevOps的理解大家眾說紛紜,就連維基百科(Wikipedia)都沒有給出一個統一的定義。一般的解釋都是從字面上來理解,就是把開發(Development)和運維(Operations)整合到一起,來加速產品從啟動到上線的過程,並使之自動化。這個是對DevOps的廣義解釋,而且大多數人都是認可 ...
  • 例6 數字反轉 題目描述 給定一個整數,請將該數各個位上數字反轉得到一個新數。新數也應滿足整數的常見形式,即除非給定的原數為零,否則反轉後得到的新數的最高位數字不應為零(參見樣例2)。 輸入格式 一個整數 N 輸出格式 一個整數,表示反轉後的新數。 輸入樣例 #1 123 輸出樣例 #1 321 輸 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1. 講故事 這一期程式故障除了做原理分析,還順帶吐槽一下,熟悉我的朋友都知道我分析dump是免費的,但免費不代表可以濫用我的寶貴時間,我不知道有些人故意惡搞卡死是想幹嘛,不得而知,希望後面類似的事情越來越少吧!廢話不多說,我們來看看是如何被惡搞的。 二:WinDbg 分析 1. 程式是如 ...
  • TCP(Transmission Control Protocol): 特點:面向連接、可靠傳輸、按序交付、流量控制、擁塞控制。 用途:適用於需要高可靠性的數據傳輸,如網頁瀏覽、電子郵件、文件傳輸等。 優勢:數據包順序和完整性有保障,適合需要準確無誤傳輸數據的場景。 舉例:線上購物網站的交易數據傳輸 ...
  • 前面兩篇隨筆介紹了EAV模型(實體-屬性-值)的設計思路和Winform前端對於通用查詢的處理,本篇隨筆繼續深入EAV模型(實體-屬性-值)設計的探討,介紹實體屬性的定義,以及根據不同屬性的定義構建不同的輸入控制項處理,以及列表界面的展示。旨在結合關係型資料庫的熟練使用、性能優勢和MongoDB資料庫... ...
  • IEC60870-5-104 是一種電力自動化系統中常用的通信協議,使用 TCP/IP 協議作為底層通信協議,用於監視和控制電力系統中的各種設備,如變電站、發電機、開關等。 ...
  • 前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。 以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可 ...
  • 在這篇文章中,我們介紹瞭如何利用大型語言模型為情人節營造難忘的氛圍。通過上傳圖片併進行風格轉化,我們可以為對方呈現一幅獨特的作品,增添浪漫的色彩。同時,藉助搜索功能,我們能夠輕鬆獲取與情人節相關的信息,為策劃活動提供更多靈感和建議。 ...
  • 正文 晚上跳舞回來,在便利店照例買根冰淇淋吃。看到店裡的老闆娘在訓她孩子。言辭依稀可以聽見考上好初中之類。 當時一個臨時起意,打算買兩根冰淇淋,塞一根到他手上,說一句:“我小時候也老被罵,沒什麼。” 然後跑掉。但是在冰櫃里翻了半天,都沒找到自己想吃的那種。與此同時,聽到他媽媽聲色俱厲地說:“你知道我小時 ...
  • strcpy和memcpy 目錄strcpy和memcpy 複製內容: strcpy:專門用於複製字元串,它會一直複製直到遇到源字元串中的'\0'結束符。這意味著如果源字元串長度超過了目標緩衝區的大小(不包括'\0'),就會發生緩衝區溢出,這是一個常見的安全隱患。 memcpy:可以複製任意內容,如 ...
  • 本文介紹在Visual Studio中,通過屬性表,使得一個新建解決方案中的項目可以快速配置已有解決方案的項目中各類已編譯好的C++第三方庫的方法~ ...
  • 將多個第三方包封裝成一個項目後,如果你的目的是讓其他開發人員可以直接引用這些依賴,一般來說有兩種常見的方式: 打成JAR包:將封裝好的項目編譯打包成JAR文件,其他開發人員可以將這個JAR文件添加到他們的項目中,併在項目的構建工具(比如Maven)中配置該JAR作為依賴。這樣做的好處是簡單直接,其他 ...