简介:
作者学校学习中作业的积累、存档,希望在之后学习中,不断优化程序,减少事件复杂度,提高运行效率与代码健壮性、可读性。
题目:
一个数如果恰好等于它的因子之和,这个数就称为“完数”,例如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;
}
得结果
补充另一道题:
题目:
将一个正数分解质因数,例如:输入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<stdio.h>
//质数判断
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;
}