Bailian2686 打印完数暴力
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian2686 打印完数暴力相关的知识,希望对你有一定的参考价值。
2686:打印完数
总时间限制: 1000ms 内存限制: 65536kB
描述
一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序打印出1000之内(包括1000)所有的完数,并按如下格式输出其所有因子:
6 its factors are 1,2,3
输入
无输入
输出
输出1000以内所有的完数及其因子,每行一个完数。
样例输入
样例输出
来源
计算概论05
问题链接:Bailian2686 打印完数
问题简述:(略)
问题分析:
按Markdown格式重写了题解,旧版题解参见参考链接。
优化的方法是素数打表,用素数去试除。这里使用的是暴力法。解题程序可以写一个函数来计算因子之和,也可以直接计算。
程序说明:(略)
参考链接:Bailian2686 打印完数【暴力】
题记:没有找到好算法,暴力法就是最好的办法。
AC的C语言程序(因子之和函数)如下:
/* Bailian2686 打印完数 */
#include <stdio.h>
#define N 1000
int ans[N / 3], cnt;
int psum(int n)
{
int i, sum = 1;
for (i = 2, cnt = 0; i < n; i++)
if (n % i == 0) sum += i, ans[cnt++] = i;
return sum;
}
int main(void)
{
int i, j;
for (i = 2; i <= N; i++) {
if (psum(i) == i) {
printf("%d its factors are 1", i);
for (j = 0; j < cnt; j++)
printf(",%d", ans[j]);
printf("\\n");
}
}
return 0;
}
AC的C语言程序如下:
/* Bailian2686 打印完数 */
#include <stdio.h>
#define N 1000
int ans[N / 3], cnt;
int main(void)
{
int i, j;
for (i = 2; i <= N; i++) {
int sum = 1;
for (j = 2, cnt = 0; j < i; j++)
if (i % j == 0) sum += j, ans[cnt++] = j;
if (sum == i) {
printf("%d its factors are 1", i);
for (j = 0; j < cnt; j++)
printf(",%d", ans[j]);
printf("\\n");
}
}
return 0;
}
以上是关于Bailian2686 打印完数暴力的主要内容,如果未能解决你的问题,请参考以下文章
数字之谜1——质(素)数续详细讲解“打印一千以内的所有完数”~~
数字之谜1——质(素)数续详细讲解“打印一千以内的所有完数”~~