注册 登录
编程论坛 C语言论坛

c语言题目遇到问题求大神解答

elhut 发布于 2022-04-10 17:19, 1701 次点击
找完数:
所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:
2 30

输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

怎么样才能输出那些因子呢
求大佬解答
8 回复
#2
rjsp2022-04-10 19:00
程序代码:
#include <stdio.h>
#include <stdbool.h>

bool 是完数吗( unsigned n )
{
    unsigned sum = 1;
    for( unsigned i=2; i<n; ++i ) // 效率就别考虑了,n最大才10000
        if( n%i == 0 )
            sum += i;
    return sum==n;
}
#3
elhut2022-04-10 20:02
回复 2楼 rjsp
谢谢大佬,但是这个题目还要求输出完数的每个因子。。。。这个怎么搞哇
#4
elhut2022-04-10 20:19
回复 2楼 rjsp
啊,对不起,刚刚去翻了一下别的帖子,才知道还有数组这个操作,,打扰了
#5
rjsp2022-04-10 23:04
才知道还有数组这个操作
可以不用数组,因为所有完数都可以写成 1+2+3+…… 的形式
程序代码:
#include <stdio.h>
#include <stdbool.h>

bool 是完数吗( unsigned n )
{
    unsigned sum = 0;
    for( unsigned i=1; i<n; ++i ) // 效率就别考虑了,n最大才10000
        if( n%i == 0 )
            sum += i;
    return n!=0 && sum==n;
}

int main( void )
{
    for( unsigned i=0; i<=10000; ++i )
    {
        if( 是完数吗(i) )
        {
            // 所有完数都可以写成 1+2+3+…… 的形式
            printf( "%u = 1", i );
            for( unsigned j=1; j*(j+1)/2!=i; ++j )
                printf( " + %u", j+1 );
            putchar( '\n' );
        }
    }
}

#6
zhu1135224642022-05-28 23:42
回复 5楼 rjsp
哥    接写C语言软件么   高价
#7
追梦人zmrghy2022-05-29 21:13
只有本站会员才能查看附件,请 登录
#8
追梦人zmrghy2022-05-29 21:25
只有本站会员才能查看附件,请 登录
#9
chenyucheng2022-07-05 14:12
回复 5楼 rjsp
程序代码:
#include <stdio.h>
#include <stdbool.h>

bool shiWanQuanShu( unsigned n )//是完全数(吗)
{
    unsigned sum = 0;
    for( unsigned i=1; i<n; ++i ){ // 效率就别考虑了,n最大才10000
        if( n%i == 0 ) sum += i;
    }
    return n!=0 && sum==n;
}

int main( )
{
    unsigned int a; unsigned int b;
    printf("请输入求完全数的范围,空格隔开:");
    scanf("%u %u",a,b);//输入范围
    for( unsigned i=a; i<=b; ++i )
    {
        if( shiWanQuanShu(i) )
        {
            // 所有完全数都可以写成 1+2+3+…… 的形式
            printf( "%u = 1", i );
            for( unsigned j=1; j*(j+1)/2!=i; ++j )
                printf( " + %u", j+1 );
            putchar( '\n' );
        }
    }
    return 0;
}
1