算法练习-day01判断质数和找出计算完全数

224 阅读1分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天

题目1

从键盘输入一个整数,判断该数是否为素数(质数)。素数是指再大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

思路


由质数定义可知,我们可以遍历除以从键盘输入的数的前面的所有数,如果除不尽(即取余后不等于零)则表示该数为质数。 要打印出来该质数,我们可以在当它余数为零的时候break,跳出循环(此时已经表明该数不是质数了),如果遍历到该数前一个数的时候还没有break,则表明它是质数可以通过这一点将其打印出来

算法实现

int main()
{
	int a;//存取键盘输入的值
	scanf("%d", &a);//从键盘读入数据
	//用循环遍历该数前面的所有数,如果都除不净则为质数
	int i;//i为a所需要除的数
	for (i = 2; i < a; i++)
	{
		if (a % i == 0)
		{
			break;
		}
		if(i==(a-1))//如果遍历到该数前一个数了则表示该数是质数则打印出来
		{
			printf("%d是质数\n", a);
		}
		
	}
        

示例

image.png

题目2

求解从2到20000的所有完全数,完全数是指它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。

思路

——————————————————————————————————————

和第一题在整体思路差不多,先遍历出所有的约数,然后将约数都加起来与原数比较。 第一遍的时候没有写双循环,是从键盘输入一个数判断是否为完全数,这部写好之后就可以在其外面再套一个循环遍历2到2000的所有的数,这里要注意的是在在第一个循环和第二个循环之间要把sum再一次置为零。

算法实现

——————————————————————————————————————

//先把该数的约数都找出来,再相加与该数再比较
int main()
{
	int i, j;
	int sum = 0;
	
	for (j = 2; j <= 20000; j++) {
		sum = 0;//每次循环回来要把sum重置
		for (i = 1; i < j; i++)
		{
			if (j % i == 0)
			{
				sum = sum + i;
			}
		}
        if (i == sum)
		{
			printf("%d是完全数\n", i);
		}
	}
	return 0;
	
}

示例

image.png

总结,这里用的方法都是暴力算法完全没有简便,都是遍历到所有的数,时间复杂度太大了,后续将会简化。