C語言程式設計100例之(8):尼科徹斯定理

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

例8 尼科徹斯定理 題目描述 尼科徹斯定理可以敘述為:任何一個整數的立方都可以表示成一串連續的奇數的和。需要註意的是,這些奇數一定是連續的,如:1,3,5,7,9,…。 例如,對於整數5,5*5*5=125=21+23+25+27+29。 對於整數6,216=31+33+35+37+39+41, 也 ...


例8    尼科徹斯定理

題目描述

尼科徹斯定理可以敘述為:任何一個整數的立方都可以表示成一串連續的奇數的和。需要註意的是,這些奇數一定是連續的,如:1,3,5,7,9,…。

例如,對於整數5,5*5*5=125=21+23+25+27+29。

對於整數6,216=31+33+35+37+39+41,

也可以表示為216=7+9+11+13+15+17+19+21+23+25+27+29。

請你編寫程式對這個定理進行驗證。

輸入格式

一個整數n(2≤n≤1000)。

輸出格式

將n的立方表示為一串連續的奇數的和,具體格式見輸出樣例。若有多種表示方式,任意輸出一種即可。

輸入樣例

29

輸出樣例

29*29*29=24389=813+815+817+819+821+823+825+827+829+831+833+835+837+839+841+843+845+847+849+851+853+855+857+859+861+863+865+867+869

        (1)編程思路1。

        先計算輸入數n的立方num,然後從1(用變數i記錄)開始累計和sum,累計每次j加2保證下個數也為奇數,如果累加和sum大於立方數num時,跳出本次迴圈,進行下一次的嘗試(i=3或5、7、…開始累積和)。當找到後,記錄開始位置(即i),結束位置(即j),輸出。

        程式寫成一個嵌套的二重迴圈。外迴圈i控制累計和的起點,內迴圈累計i、i+2、i+4、…的和。

      (2)源程式1。

#include<stdio.h>

int main()

{

    int n,num,sum,i,j,k,flag;

    while(1)

    {

         scanf("%d",&n);

         if(n==0)  break;

         num = n * n * n;

         flag=0;

         for(i=1; i<num && flag==0; i=i+2)

        {

            sum=0;

            for(j=i; j<num; j=j+2)

            {

               sum += j;

               if(sum == num)

              {

                  printf("%d*%d*%d=%d=%d",n,n,n,num,i);

                  for (k=i+2; k<=j;k+=2)

                      printf("+%d",k);

                  printf("\n");

                  flag=1;

                  break;

              }

              else if (sum > num)

                  break;

           }

       }

    }

    return 0;

}

      (3)編程思路2。

        源程式1的思路是通過試探的方法來驗證尼科徹斯定理,採用二重迴圈實現。

        實際上,n的立方一定可以表示為一個等差數列的各項和,該等差數列的首項為n*n-n+1,公差為2,項數為n。

        按等差數列的求和公式知該數列的和為:

        [(n*n-n+1)+( n*n-n+1)+ 2 (n-1)]*n/2 =n*n*n

        因此,直接用迴圈輸出這個等差數列的各項即可。

       (4)源程式2。

#include<stdio.h>

int main()

{

    int n,a,i;

    while(1)

    {

         scanf("%d",&n);

         if(n==0)  break;

        // 輸出等差數列,首項為n*n-n+1,公差為2,項數為n

        a=n*n-n+1;

        printf("%d*%d*%d=%d=%d",n,n,n,n*n*n,a);

        for (i=1; i<n;i++)

             printf("+%d",a+i*2);

        printf("\n");

    }

    return 0;

習題8

8-1  谷角猜想

題目描述

日本數學家谷角靜夫在研究自然數時發現了一個奇怪現象:對於任意一個自然數 n ,若 n 為偶數,則將其除以 2 ;若 n 為奇數,則將其乘以 3 ,然後再加 1 。如此經過有限次運算後,總可以得到自然數 1 。人們把谷角靜夫的這一發現叫做“谷角猜想”。

請你編寫程式對這個猜想進行驗證。

輸入格式

一個自然數n。

輸出格式

把 n 經過有限次運算後,最終變成自然數 1 的全過程輸出。具體格式見輸出樣例。

輸入樣例

34

輸出樣例

34/2=17

17*3+1=52

52/2=26

26/2=13

13*3+1=40

40/2=20

20/2=10

10/2=5

5*3+1=16

16/2=8

8/2=4

4/2=2

2/2=1

         (1)編程思路。

        定義迭代變數為n,按照谷角猜想的內容,可以得到兩種情況下的迭代關係式:當 n 為偶數時,n=n/2 ;當 n 為奇數時, n=n*3+1 。

        這就是需要電腦重覆執行的迭代過程。這個迭代過程需要重覆執行多少次,才能使迭代變數 n 最終變成自然數 1 ,這是我們無法計算出來的。因此,還需進一步確定用來結束迭代過程的條件。由於對任意給定的一個自然數 n ,只要經過有限次運算後,能夠得到自然數 1 ,從而完成驗證工作。因此,用來結束迭代過程的條件可以定義為: n==1 。

       (2)源程式。

#include<stdio.h>

int main()

{

   unsigned int data;

   scanf("%d",&data);

   while(data!=1)

   {

        if((data%2==0))

        {

                 printf("%d/2=%d\n",data,data/2);

                 data/=2;

         }

        else

        {

                printf("%d*3+1=%d\n",data,data*3+1);

                data=data*3+1;

        }

   }

   return 0;

}

8-2  四方定理

題目描述

數論中著名的“四方定理”是:所有自然數至多只要用四個不小於0的整數的平方和就可以表示。

編寫一個程式驗證此定理。

輸入格式

一個自然數n。

輸出格式

把自然數 n 表示為四個數的平方和。具體格式見輸出樣例。

輸入樣例

147

輸出樣例

7*7+7*7+7*7+0*0=147

8*8+7*7+5*5+3*3=147

9*9+5*5+5*5+4*4=147

9*9+7*7+4*4+1*1=147

9*9+8*8+1*1+1*1=147

11*11+4*4+3*3+1*1=147

11*11+5*5+1*1+0*0=147

12*12+1*1+1*1+1*1=147

        (1)編程思路。

        對於待驗證的自然數n,用四個變數i、j、k、l採用試探的方法,窮舉進行計算,滿足要求(i *i + j * j + k * k + l * l == n)時輸出計算結果。

        在窮舉時,不妨設i≥j≥k≥l。因此,窮舉的範圍可確定為:

1 ≤ i ≤ n/2

0 ≤ j ≤ i

0 ≤ k ≤ j

0 ≤ l ≤ k

       (2)源程式。

#include<stdio.h>

int main()

{

    int n,i,j,k,l;

    scanf("%d",&n);

    for (i = 1; i <= n/2; i++)          // 對i,j,k,l進行窮舉

        for (j = 0; j <= i; j++)

            for (k = 0; k <= j; k++)

                for (l = 0; l <= k; l++)

                    if (i *i + j * j + k * k + l * l == n)

                     {

                          printf("%d*%d+%d*%d+%d*%d+%d*%d=%d\n",i,i,j,j,k,k,l,l,n);

                      } 

   return 0;

}

8-3  卡布列克運算

問題描述

所謂卡布列克運算,是指任意一個四位數,只要它們各個位上的數字不全相同,就有這樣的規律:

(1)把組成這個四位數的四個數字由大到小排列,形成由這四個數字構成的最大的四位數;

(2)把組成這個四位數的四個數字由小到大排列,形成由這四個數字構成的最小的四位數(如果四個數字中含有0,則此數不足四位);

(3)求出以上兩數之差,得到一個新的四位數。

重覆以上過程,總能得到最後的結果是 6174。

例如,n= 3280,驗證結果為:8320-238=8082  8820-288=8532  8532-2358=6174

編寫一個程式對卡布列克運算進行驗證。

輸入數據

一個各位上的數字不全相同的四位數n。

輸出要求

把 n 經過有限次卡布列克運算後,最終變成6174的全過程輸出。具體格式見輸出樣例。

輸入樣例

2019

輸出樣例

9210-129=9081

9810-189=9621

9621-1269=8352

8532-2358=6174

 YES

       (1)編程思路。

為實現驗證程式,編寫4個函數。

void parse_sort(int each[],int num) 將num分解為各位數字併排序後存入數組each[]中。

int minD(int each[]) 求數組each中的4個數字可組成的最大數。

int maxD(int each[]) 求數組each中的4個數字可組成的最小數。

int pow10_int(int n) 求10的N次方。

     (2)源程式。

#include <stdio.h>

#define N 4

int pow10_int(int n);  // 求10的N次方

void parse_sort(int each[],int num); // 把num分解各個位上的數後存入數組each[]中

int minD(int each[]);  // 求數組each可組成的最大數

int maxD(int each[]);  // 求數組each可組成的最小數

int main()

{

    int number,max,min;

    int each[N];

    scanf("%d",&number);

    while(number!=6174)

    {

        parse_sort(each,number);

        max=maxD(each);

                   min=minD(each);

                   number=max-min;

                   printf("%d-%d=%d\n",max,min,number);

    }

    printf(" YES\n");

    return 0;

}

int pow10_int(int n)  // 求10的N次方的函數

{

    int sum=1;

    for(int i=0;i<n;i++)

         sum=sum*10;

    return sum;

}

void parse_sort(int each[],int num) // 把num分解各個位上的數後存入數組each[]中

{

         int m,i,j,t;

          for (i=0;i<N;i++)

                    each[i]=0;

          i=0;

         while(num!=0)

          {

               m=num%10;   num=num/10;

              each[i++]=m;

         }

         for(i=0;i<N-1;i++)

             for (j=0;j<N-1-i;j++)

                     if (each[j]>each[j+1])

                     {

                              t=each[j];

                              each[j]=each[j+1];

                              each[j+1]=t;

                     }

}

int minD(int each[])  // 求數組each可組成的最大數

{

    int sum=0,i;

    for(i=0;i<N;i++)

        sum+=each[i]*pow10_int( (N-1-i) );

    return sum;

}

int maxD(int each[])  // 求數組each可組成的最小數

{

    int sum=0,i;

    for(i=0;i<N;i++)

        sum=sum+each[i]*pow10_int(i);

    return sum;


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

-Advertisement-
Play Games
更多相關文章
  • 直接代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://www.echartsjs.com/examples/vendors/echa ...
  • ECharts動態獲取後臺傳過來的json數據進行多個折線圖的顯示,折線的數據由後臺傳過來 ECharts 多個折線圖動態獲取json數據 效果圖如下: js部分: function mychart1(datetime,dateNums1,dateNums2,dateNums3,dateNums4) ...
  • 一、圖表背景色配置項,如背景顏色漸變 https://www.echartsjs.com/zh/option.html#backgroundColor 二、圖表中圖形的顏色,如柱狀圖行採用漸變顏色顯示 options = { series: [ { name: '財經新聞', barWidth: ' ...
  • 直接上核心代碼,其實官網介紹的很詳細: var pageSize = 5;//每次請求新聞的條數 flow.load({ elem: '#newsList' //指定列表容器 ,scrollElem: '#newsList'//滾動條所在元素 ,done: function(page, next){ ...
  • 最主要的css樣式: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 例子: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> ...
  • 本文由葡萄城技術團隊於博客園翻譯並首發 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 JavaScript最初是為Web應用程式創建的。但是隨著前端技術的發展,大多數開發人員更喜歡使用基於JavaScript的框架。它簡化了你的代碼以及使你能完成更多全棧 ...
  • (馬蜂窩技術原創內容,公眾號 ID: mfwtech) 引言 消費者的狂歡節「雙 11」剛剛過去。在電商競爭環境日益激烈的今天,為了抓住流量紅利,雙 11 打響的已經不僅僅是「促銷戰」,也是「營銷戰」,這對平臺的技術支撐能力提出新的要求。 從 2014 年的「318 大促」,到正在進行的 「馬蜂窩雙 ...
  • 阿裡巴巴高級無線開發專家宋照春在高德技術專場做了題為《高德客戶端及引擎技術架構演進與思考》的演講,主要分享了高德地圖客戶端技術架構沿著「上漂下沉」、「模塊化、Bundle化」的思路演進所做的一系列架構升級中的經驗和思考。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...