目錄
問題陳述
方法 1
範例
輸出
方法2:最佳化方法
結論
首頁 後端開發 C++ 將階乘n表示為連續數位的和

將階乘n表示為連續數位的和

Sep 07, 2023 pm 02:29 PM
連續數字 求和 階乘表示

將階乘n表示為連續數位的和

我們將討論兩種方法來找出如何將數字的階乘表示為連續數字的總和。第一種方法是直接而簡單的方法,而在另一種方法中,我們使用算術級數的概念來使其在佔用的時間和空間方面不那麼複雜。

問題陳述

給定一個數字,我們需要找出可以將數字的階乘表示為連續自然數總和的方法。

這涉及兩個不同的功能 -

  • 求數字的階乘。

  • 找出可以將數字表示為連續自然數總和的方法數。

範例1

Given : Number = 3
Result: 1
登入後複製

眾所周知,3 的階乘是 6,可以寫成 1 2 3,因此我們的答案是:1 種方式。

範例2

Given: Number = 4
Result: 1
登入後複製

眾所周知,4 的階乘是 24,可以寫成 7 8 9,因此我們的答案是:1 種方式。

方法 1

這是一種簡單的方法,我們先找出數字的階乘,然後計算可以將其表示為連續自然數總和的方法數。此方法是將階乘表示為算術長度 len 1 的級數為 -

Factorial of Number = p + (p+1) + (p+2) + … + (p+len) 
So, p = (Number- len*(len+1)/2)/(len+1) 
We will check for the values of len from 1 to len*(len+1)/2<Number
登入後複製

當我們獲得 len 為正整數時,我們將其視為一個解。

範例

在下面的範例中,我們嘗試找出將數字的階乘表示為連續數字總和的方法的數量。

#include <bits/stdc++.h>
using namespace std;

// code for obtaining number of possible solutions
long int Number_of_solutions(long int NUMBER){
   long int counter = 0;
   for (long int len = 1; len * (len + 1) < 2 * NUMBER; len++) {
      double p = (1.0 * NUMBER - (len * (len + 1)) / 2) / (len + 1);
      if (p - (int)p == 0.0)
      counter++;
   }
   return counter;
}

// main program goes here
int main(){
   long int NUMBER = 15;
   cout << "Number of ways to write 15 as a sum of consecutive numbers: ";
   cout << Number_of_solutions(NUMBER) << endl;
   NUMBER = 10;
   cout << "Number of ways to write 10 as a sum of consecutive numbers: ";
   cout << Number_of_solutions(NUMBER) << endl;
   return 0;
}
登入後複製

輸出

當您執行上述 C 程式時,它將產生以下輸出 -

Number of ways to write 15 as a sum of consecutive numbers: 3 
Number of ways to write 10 as a sum of consecutive numbers: 1
登入後複製

方法2:最佳化方法

這是一個更好的方法;我們上面看到的方法會導致溢出。

從數字 p 開始的 len 個連續數字的總和可以寫成 -

sum = (p+1) + (p+2) + (p+3) … + (p+len) 
Hence, sum = (len*(len + 2*p + 1))/2
登入後複製

因為 sum 也等於 Number!。

我們可以寫

2*Number! = (len*(len + 2*p + 1))
登入後複製

這裡,我們將計算所有 (len, (len 2*p 1)) 對,而不是計算所有 (len, p) 對。這意味著我們將計算所有有序的 pf (A, B),其中 AB=2*Number!並且 A< B 且 A 和 B 的奇偶性不同,这意味着如果 len 是奇数,则 (len + 2*p + 1) 是偶数,如果 len 是偶数,则 (len + 2*p + 1) 是奇数。

這意味著我們正在尋找 2*Number 的奇數約數!這也是 Number 的奇數除數!

要計算除數的數量! ,我們必須計算質數在因式分解中的冪,除數的數量為 (f1 1)*(f2 1)* … *(fn 1)。

我們將使用勒讓德公式計算素數在數字階乘中的最大冪次方。

範例

下面給出了這種方法的程式碼 -

#include <bits/stdc++.h>
using namespace std;
#define maximum 5002
vector<int> v;
void sieve(){
   bool Is_the_number_prime[maximum];
   memset (Is_the_number_prime, true, sizeof(Is_the_number_prime) );
   for (int prime = 2; prime * prime < maximum; prime++) {
      if (Is_the_number_prime[prime] == true) {
         for (int iterator = prime * 2; iterator < maximum; iterator += prime)
         Is_the_number_prime[iterator] = false;
      }
   }
   for (int prime = 2; prime < maximum; prime++)
   if (Is_the_number_prime[prime])
   v.push_back(prime);
}
long long int calculate_largest_power(long long int a, long long int b){
   long long int c = 0;
   long long int x = b;
   while (a >= x) {
      c += (a / x);
      x *= b;
   }
   return c;
}
long long int modular_mult(long long int a,
long long int b,
long long int m){
   long long int result = 0;
   a = a % m;
   while (b > 0) {
      if (b % 2 == 1)
      result = (result + a) % m;
      a = (a * 2) % m;
      b /= 2;
   }
   return result % m;
}
long long int no_of_ways(long long int n,
long long int m){
   long long int answer = 1;
   for (int iterator = 1; iterator < v.size(); iterator++) {
      long long int powers = calculate_largest_power(n, v[iterator]);
      if (powers == 0)
      break;
      answer = modular_mult(answer, powers + 1, m)%m;
   }
   if (((answer - 1) % m) < 0)
   return (answer - 1 + m) ;
   else
   return (answer - 1) ;
}
int main(){
   sieve();
   long long int n = 4, m = 7;
   cout << "Number of solutions after performing modulo with 7 is " <<no_of_ways(n, m);
   return 0;
}
登入後複製

輸出

當執行上面的C 程式時,它將產生以下輸出 -

Number of solutions after performing modulo with 7 is 1.
登入後複製

結論

在本文中,我們討論了兩種不同的方法來找出數字,將數字的階乘表示為連續自然數總和。

以上是將階乘n表示為連續數位的和的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在Python中的絕對元組求和 在Python中的絕對元組求和 Sep 12, 2023 pm 07:37 PM

在Python中,元組是不可變的序列,可以儲存不同類型的多個元素。它們通常用於表示相關值的集合。元組求和涉及將兩個或多個元組的相應元素相加以產生新的元組。然而,在某些場景下,可能需要計算元素的絕對和而不是傳統的和。在這篇文章中,我們將探討如何在Python中執行絕對元組求和。傳統元組求和在深入研究絕對元組求和之前,讓我們先了解如何進行傳統的元組求和。給定兩個長度相同的元組,我們可以使用簡單的Python循環或列表推導來計算對應元素的和 −deftuple_sum(t1,t2):

你知道Word表格怎麼求和嗎 你知道Word表格怎麼求和嗎 Mar 21, 2024 pm 01:10 PM

有時候,我們在Word表格中會經常遇到計數的問題;通常遇到這樣的問題,大部分同學都回把Word表格複製到Excel中來計算;還有一部分同學會默默地拿起計算器去算。那有沒有快速的方法來計算呢?當然有啊,其實在Word中也是可以計算求和的。那麼,你知道該怎麼操作嗎?今天,我們就來一起來看吧!廢話不多說,有需要的朋友趕緊收藏起來吧!步驟詳情:1、首先,我們開啟電腦上的Word軟體,開啟需要處理的文件。 (如圖)2、接著,我們將遊標定位在求和數值所在的儲存格上(如圖);然後,我們點選【選單列

求交錯符號等差數列的和 求交錯符號等差數列的和 Sep 16, 2023 pm 05:01 PM

算術級數(AP)是一系列數字,其中連續兩個項之間的差異相同。差是從第一個項減去第二個項來計算的。讓我們以一個範例序列來了解AP,5,7,9,11,13,15,...這個算術級數的公差(d)是2。這意味著每個後續元素與前一個元素的差為2。這個序列的第一項(a)是5。找到第n項的一般公式是a{n}=a+(n-1)(d)在這個問題中,我們給了一個AP,我們需要找到交替帶符號平方的級數的和,級數將如下圖所示,a12-a22+a32-a42+a52+......讓我們舉一個例子,以便更清楚地理解&amp

使用PHP中的array_sum()函數求數組中元素的和 使用PHP中的array_sum()函數求數組中元素的和 Nov 18, 2023 am 11:20 AM

標題:使用PHP中的array_sum()函數求取陣列元素的和PHP是一種廣泛使用的伺服器端腳本語言,它提供了眾多內建函數,可以簡化開發過程並提高效率。其中,array_sum()函數是一個非常實用的函數,可以用來計算數組中元素的和。在本文中,我們將學習如何使用array_sum()函數,並給出具體的程式碼範例。首先,我們需要了解array_sum()函數的使

excel合計怎麼自動求和 excel合計怎麼自動求和 Mar 20, 2024 pm 12:20 PM

對於經常使用excel表格的使用者來說,自動求和功能是非常簡單的一種操作,而且可以根據我們的需求自動求和後保留幾位小數位,比我們手動按計算器方便多了。對於小白用戶來說,還需要從頭學起excel合計怎麼自動求和,下面一起來看看步驟:excel自動求和:首先,我們需要將A1單元格和B1單元格中的數字相加,並將結果顯示在C1單元格中。要實現這一步驟,首先在A1和B1單元格中輸入需要相加的數字。接著,選取C1儲存格,輸入下列公式:`=A1+B1`,按下回車鍵後,C1儲存格將顯示A1和B1儲存格中數字的和。

如何使用Go語言的陣列函數求和並傳回結果? 如何使用Go語言的陣列函數求和並傳回結果? Jul 31, 2023 pm 02:25 PM

如何使用Go語言的陣列函數求和並傳回結果? Go語言提供了豐富的陣列操作函數,其中包含了求數組元素和的函數。使用這些函數可以方便地對陣列進行求和操作,並傳回結果。本文將介紹如何使用Go語言的陣列函數求和並傳回結果,並附帶程式碼範例。首先,我們先來了解Go語言中的陣列。數組是一種儲存固定大小元素序列的資料結構。在Go語言中,陣列的長度是固定的,而且陣列的型別和元

excel求和公式怎麼用-excel求和公式使用教學課程 excel求和公式怎麼用-excel求和公式使用教學課程 Mar 05, 2024 pm 12:40 PM

有很多朋友還不知道excel求和公式怎麼用,所以下面小編就講解了excel求和公式的使用教程,有需要的小伙伴趕緊來看一下吧,相信對大家一定會有所幫助哦。第一步:首先我們打開Excel(如圖)。步驟二:進入Excel工作介面(如圖)。第三步:接著我們開啟需要編輯的文檔,此處為範例文檔(如圖)。第四步:勾選「總分」在fx函數方塊中輸入「=C2+D2+E2」.然後按下回車鍵。總分出來了(如圖)。第五步:點選填滿框的下拉選單。進行總分填充(如圖)。第六步:填入下拉(如圖)。第七步:

Java程式列印數字的求和 Java程式列印數字的求和 Aug 20, 2023 am 09:49 AM

Java 中有多種添加數字的方法。要添加的數字可以在運行時輸入,也可以直接放在程式中。但是,如果數字列表太大,則很難以這種方式添加數字。有時,要添加的數據是在Excel 電子表格中給出的

See all articles