输入一个正整数N,求出这个数字存在多少个因子,以及因子之和。
存在多组测试数据,每组测试数据输入一个正整数N(1<=N<=10^9)
对于每组测试数据输出一行,包含两个数字,分别是因子数和因子和。
其中有一种方法比较费时
#include <iostream>
using namespace std;
int main()
{
long long a;
while (cin >> a)
{
long long c = 0;
long long b = 0;
for (long long i = 1; i <=a; i++)
{
if (a % i == 0)
{
b++;
c += i;
}
}
cout << b << " " << c << endl;
}
}
但是当数很大很大时,这个程序运行的时间就会变得较长,所以需要改变一下 把时间效率提高
我们可以想一想输入一个数n 当n%i==0时 i为n的因子 那n/i是不是也是n的因子,拿个数举个例子
比如12 12%3==0 3是12的因子 12/3=4 4也是12的因子 我们可以在求出3是12的因子的同时求出4也是12的因子 这样一来那就好多了 但是还有个问题需要考虑 就是当i和n/i相等时 不能计入 比如9的因子3 不能计入两次 而且还有一个问题也是重复计入的问题 继续拿12举例子 当i=3的时候我们已经把 3和4计入因子了 下个循环i++之后i=4了 那3和4则又会被计入,所以我们应该修改一下循环的条件 把i<=a 改称 i*i<=a 或者 i<=根号下a 代码如下
#include <iostream>
using namespace std;
int main()
{
long long a;
while (cin >> a)
{
long long c = 0;
long long b = 0;
for (long long i = 1; i*i <=a; i++)
{
if (a % i == 0)
{
b++;
c += i;
if (i != a / i)
{
b++;
c += a/i;
}
}
}
cout << b << " " << c << endl;
}
}
代码运行结果