目录
问题陈述
方法 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脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++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