C语言-求完数简单算法

简介:
作者学校学习中作业的积累、存档,希望在之后学习中,不断优化程序,减少事件复杂度,提高运行效率与代码健壮性、可读性。
题目:
一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如6=1+2+3,编程找出1000以内的所有完数。
分析:

1.需要有一个函数来执行等式右边的运算,即找到一个数的因子(不包括本身),并进行求和之后方便与等式右边求和。

2.接下来考虑等式的左边,既然题目让我们找到1000以内的完数,则需要要使用循环遍历处1到1000的数字。

3.得到等式两边即可进行判断,判断成立,返回1,存入数组并输出

(为节省内存开辟动态数组)

因子查找的实现:
//找数字的因子函数
//考虑因子对称性,采用x/2减少复杂度
int find(int x) {
	int all=0;
	for (int i = 1; i <=(x/2) ; i++)
	{	//判断是否是因子
		if (x%i == 0) {
			//求取因子之和
			all += i;
		}
	}
	return all;
}

2.等式的遍历与比较:

//完数为因子之和
int main() {
	int size = 1000;
	//由于未知因子个数,开辟动态内存
	int* arr= (int*)malloc(sizeof(int)*size);
	//检测是否传入空指针
	if (arr == NULL)
	{
		perror("main");
		return;
	}
	for (int i = 1; i <= 1000; i++)
	{
		if (i == find(i))
		{//完数确定
			arr[i] = i;
			//完数输出
			printf("完数是“%d”\n", arr[i]);
		}
	}
	free(arr);

return 0;
}

得结果

C语言-求完数简单算法_第1张图片

补充另一道题:
题目:

将一个正数分解质因数,例如:输入90,打印出90=2*3*3*5。

​​​分析:

1.获取用户输入。

2.找到一个最小质数

3.如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

4.如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商作为新的正整数n,重复执行第一步。

5.如果n不能被k整除,则用k+1作为k的值,重复执行第一步

代码实现:
#include
//质数判断
int Sentence(int x) {
	int count = 0;
	for (int i = 1; i <=x; i++)
	{
		if (x%i == 0)
		{
			count++;
		}
	}
	if (count == 2)
		return 1;
	else 
		return 0;
}
int main() {
	printf("please input n number\n");
	int n;
	scanf_s("%d", &n);
	printf("%d=", n);
	int i = 1;
	while (n%i == 0&&n>i) {
		for (i = 2; i <=n;)
		{
			if (n%i == 0 && Sentence(i))
			{//为了输出的美观性
				if (n != i)
				{
					printf("%d*", i);
					n /= i;
				}
				else
				{
					printf("%d", i);
					n /= i;
				}
			}
			else
				i++;
			
		}
}
	return 0;
}
结果:

C语言-求完数简单算法_第2张图片

你可能感兴趣的:(算法)