c++求输入一个正整数N,求出这个数字存在多少个因子,以及因子之和。

输入一个正整数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;
	}
}

代码运行结果

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值