首页 > 编程语言 >【C++】以最快的速度求一个数的因数之和

【C++】以最快的速度求一个数的因数之和

时间:2023-01-04 11:15:15浏览次数:44  
标签:std include int 最快 cin C++ 因数 using main

源代码: 

#include<iostream>
using namespace std;
int main(){
    int a,b=0;
    cin>>a;
    for(int i=2;i<a;i++){
        if(a%i==0){
            b+=i;
        }
    }
    cout<<b;
}

 

  上面的源代码看似整洁,但实际上如果数无限大,例如8亿,那么程序也就会运行8亿次。

  我们来举个例子。

  100的因数(除1和他本省)有2、50、4、25、5、20、10。发现只要算到数的一半,就可以了。

我们就可以把代码优化成这样:

#include<iostream>
using namespace std;
int main(){
    int a,b=0;
    cin>>a;
    for(int i=2;i<=a/2;i++){
        if(a%i==0){
            b+=i;
        }
    }
    cout<<b;
}

  但这样还是不够优化。

  我们发现因数都是成对成对的,还是前面的那个例子,2和50一组,4和25一组,5和20一组,10和10一组(只算1次)。

  我们可以一次添加两个数:

b+=i+a/i;

  这样就可以了。

  这是还有一个问题,就是要运行多少次呢?

  如果i和前面加的数重复,那么程序就该停止了。我们知道i是不断增加的,而a/i是不断减少的。我们只要让i一定小于等于a/i,就不会重复。不妨设想一下,如果i>a/i;那么i的平方就一定大于i*a/i也就是a。所以我们得出,如果i*i>a,那么程序就要暂停了。

因此,我们得出代码:

#include<iostream>
using namespace std;
int main(){
  int a,b=0;
  cin>>a;
  for(int i=2;i*i<=a;i++){
    if(a%i==0){
      b+=i;
    }
  }
  cout<<b;
}

  我们最后关注一下i是a的平方根的情况。

  这里我们就直接用if else来判断:

if(i*i==n) b+=i;
else b+=i+a/i;

就得出了最快速的方法:

 

#include<iostream>
using namespace std;
int main(){
    int a,b=0;
    cin>>a;
    for(int i=2;i*i<=a;i++){
        if(a%i==0){
            if(i*i==n) b+=i;
            else b+=i+a/i;
        }
    }
    cout<<b;
}

 

这个代码虽然没有第一个代码整洁,但运行速度却已经提高了好几倍了。

 

标签:std,include,int,最快,cin,C++,因数,using,main
From: https://www.cnblogs.com/LightAplis/p/17024280.html

相关文章

  • 基因数据处理121之SSW的score matrix调整,使得与SparkSW评分一致
    更多代码请见:​​https://github.com/xubo245​​基因数据处理系列1.解释SSW的评分矩阵是128*128的,是按char的int值来进行计算的。而blosum50是蛋白质的,而且不是按ABC顺序来......
  • 基因数据处理119之java调用SSW在linux下运行
    更多代码请见:​​https://github.com/xubo245​​基因数据处理系列1.解释测试自带Example:xubo@xubo:~/xubo/tools/Complete-Striped-Smith-Waterman-Library/src$scala-D......
  • 基因数据处理16之scala对BWASW运行结果进行时间统计
    说明:环境如上篇对BWASW数据处理的时候pattern需要修改,由于有很多这样的段:[bsw2_aln]read17598sequences/pairs(10000016bp)...[bsw2_aln]read17644sequences/pairs......
  • 基因数据处理17之使用scala对BWA运行结果进行各阶段程序时间提取和统计求和
    提取代码:packagetestimportscala.io.Sourceimportjava.io.File._importjava.io.PrintWriterobjectlogPatternBwaAllextendsApp{valout=newPrintWriter("file/bw......
  • C++_控制结构和pipeline
    控制结构过程式编程范式叫做——指令式编程,而把函数式编程范式叫做——声明式编程过程式编程范式控制结构允许程序根据不同的状态、条件和参数来选择不同的处理和执行......
  • 工厂模式C++实现 (内附简单源码实现)
    抽象工厂模式为什么要用抽象工厂模式?*举个实际应用的例子,一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的;这个时候,厂商建造两个工厂,工厂A负责生产非......
  • C++ | 4-易用性改进
    使用auto自动类型推断,顾名思义,就是编译器能够根据表达式的类型,自动决定变量的类型(从C++14开始,还有函数的返回类型),不再需要程序员手工声明。但需要说明的是,auto并没有......
  • C++ 数学与算法系列之牛顿、二分迭代法求解非线性方程
    1.前言前文介绍了如何使用“高斯消元法”求解线性方程组。本文秉承有始有终的态度,继续介绍“非线性方程”的求解算法。本文将介绍2个非线性方程算法:牛顿迭代法。二......
  • C++11:移动构造函数
    1.拷贝构造函数中的深拷贝问题在C++98/03标准中,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数。拷贝构造函数的实现原理很简单,就是为新对象复制......
  • C++中的模板
    如果函数的参数类型不确定,可以使用函数模板template<classT>Tmax(Ta,Tb){ returna>b?a:b;}如果类的成员类型不确定,可以使用类模板。这样定义类:template......