问题 O: 1000以内的完数
题目描述
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
输入
一个sum (sum < 1000) ,表示测试数据的组数,接着sum行,每一行表示一个测试数据n,表示要求1到n以内的完数,1在这里不算是完数。
输出
范围内的完数,如果范围内没有完数请输出none,每组测试数据空出一行(如果完数有多个,每个数字后面都输出空格)。
样例输入
2
1
6
样例输出
none
6
提示
不要妄想输出答案。
my wrong:
#include
int main()
{
int n,i,sum,j,k,m;
scanf("%d",&j);
sum=0;
for(k=0; k<j; k++)
{
scanf("%d",&n);
for(m=1; m<n; m++)
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum=i+sum;
}
}
if(sum==m)
{
printf("%d ",sum);
}
if(sum==0)
{
printf("none\n");
}
}
}
个人思路:
1:先找出1000以内所有的数的因子,保存
2:在计算这些数的因子的和是否相等于这个数,判断是否是完数
#include <stdio.h>
#include <Math.h>
bool matchNum(int num);
void main()
{
for (int i = 0; i < 1000; i++)
{
if (matchNum(i))
{
printf("%d\n", i);
}
}
}
bool matchNum(int num)
{
int k = sqrt(num);
int sum = 1;
for (int i = 2; i <= k; i++)
{
if (num%i == 0)
{
sum += i;
if (num / i != i)
{
sum += num / i;
}
}
}
return sum == num;
}
简单 如果用C语言几个for循环就可以解决 主要是逻辑思想
#include"stdio.h"
#include"malloc.h"
int main()
{
int *n,i,sum=0,j,k,m;
scanf("%d",&j);
n=(int*)malloc(4*1000);//假设行数在1000之内
for(k=0; k<j; k++)
{
n[k]=(int)malloc(4);
scanf("%d",&n[k]);
}
for(k=0;k<j;k++)
{
sum=0;
for(m=1; m<n[k]; m++)
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum=i+sum;
}
}
if(sum==n[k])
{
printf("%d ",sum);
}
else
{
printf("none\n");
}
}
return 0;
}
再贴一边
#include"stdio.h"
#include"malloc.h"
int main()
{
int n,i,sum=0,j,k,m;
scanf("%d",&j);
n=(int)malloc(4*1000);//假设行数在1000之内
for(k=0; k<j; k++)
{
n[k]=(int)malloc(4);
scanf("%d",&n[k]);
}
for(k=0;k<j;k++)
{
sum=0;
for(m=1; m<n[k]; m++)
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum=i+sum;
}
}
if(sum==n[k])
{
printf("%d ",sum);
}
else
{
printf("none\n");
}
}
}
//这是经我优化的程序
#include
#include
bool matchNum(int num);
void main()
{
for (int i = 0; i < 1000; i++)
{
if (matchNum(i))
{
printf("%d\n", i);
}
}
}
bool matchNum(int num)
{
int k = sqrt(num);
int sum = 1;
for (int i = 2; i <= k; i++)
{
if (num%i == 0)
{
sum += i;
if (num / i != i)
{
sum += num / i;
}
}
}
return sum == num;
}
你新建一个工程,贴入这段代码
public static void main(String[] args) {
for (int i = 2; i < 1000; i++) {
check(i);
}
}
private static void check(int i) {
Set<Integer> set = new HashSet<Integer>();
set.add(1);
for (int j = 2, l = (int) Math.sqrt(i); j <= l; j++) {
if (i % j == 0) {
set.add(j);
set.add(i / j);
}
}
int sum = 0;
for (int j : set) {
sum += j;
}
if (sum == i) {
System.out.print(i + ": ");
for (int j : set) {
System.out.print(j + " ");
}
System.out.println();
}
}
希望对你有帮助