求助,求一个数的因子个数的算法

storm_panda_sjb 2018-03-24 08:45:43
给定一个数 n ,让你求 n^2 的因子个数,n的范围是 1 - 10^9 ,有没有什么好算法?
...全文
1241 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
panggeQAQ 2019-07-12
  • 打赏
  • 举报
回复
首先要理解这样一个性质:对于一个整数n,因子数等于累乘(ei + 1); ei是n质因子分解的指数;
那么对于n^2,对分解式平方,指数从ei变2*ei,所以对于的因子个数变成累乘(2ei + 1)。
leetow2006 2018-05-19
  • 打赏
  • 举报
回复
不知道欧拉函数是不是可以用得上
  • 打赏
  • 举报
回复
不过在数学定义上,一个数的因子包括1,不包括自身。
  • 打赏
  • 举报
回复
好吧,有道理。
mLee79 2018-04-02
  • 打赏
  • 举报
回复
这只是个定义问题, 大部分的定义应该是包含自己本身的, 像素数的定义一般都是只包含 1和自身两个因子的数叫素数 ..
mLee79 2018-03-30
  • 打赏
  • 举报
回复
还是应该把 n 本身算成一个, 这样大概可以, 范围这么小, 筛法就乱写了 ...
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <math.h>

#define NMAX		32768
#define PIMAX		3512
#define NPRI		4096

int primes[NPRI];
int init(void)
{
	int bits[NMAX / 8 / sizeof(int) + 1], k, p;
	memset(bits, 0xFF, sizeof(bits));

	bits[0] &= ~3;
	for (p = 3; p < NMAX; p += 2)
	{
		if (bits[p / 8 / sizeof(int)] & (1 << (p % (8 * sizeof(int)))))
		{
			for (k = p * p; k < NMAX; k += p)
				bits[k / 8 / sizeof(int)] &= ~(1 << (k % (8 * sizeof(int))));
		}		
	}

	k = 1;
	primes[0] = 2;
	for (p = 3; p < NMAX; p += 2)
	{
		if (bits[p / 8 / sizeof(int)] & (1 << (p % (8 * sizeof(int)))))
			primes[k++] = p;
	}
	return k;
}

int solve(int N)
{
	int r = 1, X[12], n = 0, i = 0, t, sqN = sqrt(N);
	for (;;)
	{
		t = primes[i++];
		if (t > N || t > sqN)
			break;

		if (0 == N % t)
		{
			X[n] = 0;			
			do {
				++X[n];
				N /= t;
			} while (0 == N % t);
			++n;
		}
	}

	if (1 != N)
		X[n++] = 1;

	for (i = 0; i < n; ++i)
		r *= 2 * X[i] + 1;

	return r;
}

int main()
{
	int N;
	N = init();
	printf("PI(%d) == %d\n", NMAX, N);
	assert(N == PIMAX);
	while (1 == scanf("%d", &N) && N >= 1 && N <= 1000000000)
		printf("%d\n", solve(N));
}
mLee79 2018-03-30
  • 打赏
  • 举报
回复
公式应该是这样的 对 数 X 做质因数分解, 结果假定是 1^1 * a ^ A * b ^ B .... z ^ Z , 那 X 的因数个数应该是 (A+1) * (B+1) * .... (Z+1) - 1 而 X^2 的因数个数应该是 (2*A + 1) * (2*B + 1) * ... (2*Z + 1) -1 .... 比如 12 可以写做事 1 * 2^2 * 3, 所以 12 的因数数量是 (2+1) * (1+1) - 1 = 5 个, 分别是 1 2 3 4 6 而 12^2 = 144 有 (2*2+1) * (2*1+1) - 1 = 14 个, 分别是 1 2 3 4 6 8 9 12 16 18 24 36 48 72 所以楼主的就只需要对 N < 1E9 做质因数, 只需要用小于 SQRT(N)的质数去试除 N 就可以了 , 然后按公式就可以算出 N^2 的因数个数 ...
  • 打赏
  • 举报
回复
引用 4 楼 mLee79 的回复:
[quote=引用 3 楼 DelphiGuy 的回复:] 如果n的因子个数为x(均不包括本身),则n^2的因子个数为2x。
没这么简单吧, 6 的因数 1 2 3 三个, 36 的因数有 1 2 3 4 6 9 12 18 八个, 应该跟素因子的个数及幂次有关 ... [/quote] 确实没这么简单,至少2x个,另外n的因子的平方也可能是。
mLee79 2018-03-30
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
如果n的因子个数为x(均不包括本身),则n^2的因子个数为2x。
没这么简单吧, 6 的因数 1 2 3 三个, 36 的因数有 1 2 3 4 6 9 12 18 八个, 应该跟素因子的个数及幂次有关 ...
  • 打赏
  • 举报
回复
如果n的因子个数为x(均不包括本身),则n^2的因子个数为2x。
l943772573 2018-03-28
  • 打赏
  • 举报
回复
因为数很大,要不考虑下用n/质数, 质数的话就少多了,然后再进行组合。 2 * 2 * 3 = 12 (2*2)*3 = 12 (2*3)*2 = 12 (2*2*3 ) = 12 这样
赵4老师 2018-03-25
  • 打赏
  • 举报
回复
百度搜相关关键字。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧