- 热门类别 (Trending Categories)
- 数据结构
- 网络
- 关系数据库管理系统 (RDBMS)
- 操作系统
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C语言编程
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- 物理学
- 化学
- 生物学
- 数学
- 英语
- 经济学
- 心理学
- 社会学
- 服装学
- 法学
- 精选阅读 (Selected Reading)
- UPSC IAS 考试笔记 (UPSC IAS Exams Notes)
- 开发者最佳实践 (Developer's Best Practices)
- 问答 (Questions and Answers)
- 有效的简历撰写 (Effective Resume Writing)
- 人力资源面试问题 (HR Interview Questions)
- 计算机术语表 (Computer Glossary)
- 人物介绍 (Who is Who)
史特默数 (Stormer Numbers)
为了使 N 成为史特默数,表达式 N^2+1 的最大质因数必须大于或等于 2*N,并且它必须是一个正整数。
例如,4 是史特默数。因为 4*4+1=17 的最大质因数是 17 本身,它大于 8,即 2*4。
但是 3 不是史特默数,因为 3*3+1=10。10 的最大质因数是 5,它小于 6,即 2*3。
在这个问题中,我们得到一个正整数 N,我们的目标是打印前 N 个史特默数。
输入 (INPUT): 4
输出 (OUTPUT): 1 2 4 5
以下是前 4 个史特默数。3 不是史特默数,因此未包含在内。
算法 (Algorithm)
找到数字 (N^2+1) 的最大质因数,并将其存储在任何变量中。
检查质因数是否大于或等于 2*N。
如果满足条件,则它是一个史特默数。
打印所有史特默数,直到 i 小于或等于 N。
方法 (Approach)
为了在我们的代码中实现上述算法,我们需要编写两个函数。第一个是为每种情况找出最大质因数,第二个是检查它是否大于或等于 2*N,并在同时打印该数字,如果它是一个史特默数。
为了找到每个数字 n 的表达式 (n^2+1) 的最大质因数 -
我们将用 2 除以该数字,直到它给出余数 0,并将 2 存储在 primemax 中。
现在,n 在此时必须是奇数,因此我们将只对从 i=3 到 n 的平方根的奇数整数进行迭代。
现在将 i 存储在 primemax 中,并用 i 除以 n,而 i 可以整除 n。当 i 不能整除 n 时,将其加 2 并继续。
如果 n 是质数且大于 2,则 n 不会通过之前的两个步骤变为 1,因此我们将 n 存储在 primemax 中并返回 primemax。
下一个函数将用于检查该数字是否是史特默数。如果是,我们将打印它。
我们将声明一个变量 temp 为 0,以计算前 N 个史特默数。
从 i=1 迭代到 temp 小于 N 为止。
检查 (i*i+1) 是否具有大于或等于 2*i 的最大质因数。如果上述条件为真,则打印 i 并将 temp 加 1。
示例 (Example)
以下是上述方法在 C++ 中的实现 -
#include <iostream> #include <bits/stdc++.h> using namespace std; int prime_factor(int n){ //for finding the maximum prime factor int primemax=0; while(n%2==0){ //if n is divided by 2 than we store 2 in primemax primemax=2; n=n/2; } for(int i=3;i<=sqrt(n);i+=2){ // this is only for odd number while(n%i==0){ primemax=i; n=n/i; } } if(n>2){ // when n is prime number and greater than 2 primemax=n; } return primemax; } void stormer_number(int n){ //function to print first n stormer numbers int temp=0; // for counting the stormer number for(int i=1;temp<n;i++){ // for iterating the all number int check=(i*i)+1; // for storing the (i*i)+1 value in check if(prime_factor(check)>=(2*i)){ //for checking the number if maximum prime is greater or equal to 2*i cout<<i<<" "; temp++; } } } int main(){ int n=9; stormer_number(n); return 0; }
输出 (Output)
1 2 4 5 6 9 10 11 12
结论 (Conclusion)
在这篇文章中,我们尝试解决打印前 N 个史特默数的问题。
我们还学习了如何计算一个数的质因数。我希望这篇文章有助于消除你对这个问题的所有疑问。