首页 > 试题广场 >

完全数计算

[编程题]完全数计算
  • 热度指数:144500 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数12471428,除去它本身28外,其余5个数相加,1+2+4+7+14=28

输入n,请输出n以内(n)完全数的个数。

数据范围:

输入描述:

输入一个数字n



输出描述:

输出不超过n的完全数的个数

示例1

输入

1000

输出

3
约束条件:j * j < i #include <stdio.h>

int main() {
    int a, sum, count = 0;
    scanf("%d", &a);
    for(int i = 2; i <= a; i++)
    {
        sum = 1;
        for(int j = 2; j * j < i; j++)
        {
            if(i % j == 0)
            {
                sum += j;
                sum += (i / j);
            }
        }
        if(sum == i)
            count++;
    }
    printf("%d\n", count);
    return 0;
}

编辑于 2024-03-11 23:09:43 回复(0)
#include<stdio.h>
int func(int m)
{
    int sum=0;
    for(int i=1;i<m;i++)
    {
        if(m%i==0)
            sum+=i;
    }
    if(sum==m)
        return 1;
    else
        return 0;
}
int main()
{
    int temp=0;
    int arr[500000]={0};
    int n=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        arr[i]=i;
    for(int j=1;j<n;j++)
    {
        temp+=func(arr[j]);
    }
    printf("%d",temp);
    return 0;
}
发表于 2024-02-10 20:55:11 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    long long n = 0;
    scanf("%lld", &n);
    int a = 0;
    int count = 0;
    for (int i = 1; i <= n; i++)
    {
        int j = 1;
        for (j = 1; j < i; j++)
        {
            if (i % j == 0)
            {
                a += j;
            }
        }
        if (a == i)
        {
            count++;
            
        }
        a = 0;
    }
    printf("%d", count);
    return 0;
}
发表于 2024-01-16 10:27:36 回复(1)
#include<stdio.h>

int main(){
    int n,cnt=0;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<n+1;i++){
            int sum=0;//cnt=0;
            for(int j=1;j<i;j++){
                if(i % j == 0){
                    sum=sum+j;
                    //cnt++;
                }
            }
            if(sum == i){              
                cnt++;
            }
        }
        printf("%d",cnt);
    }
    return 0;
}
发表于 2023-11-23 11:19:50 回复(0)
#include <stdio.h>

int main() {
    int num = 0;
    while (scanf("%d", &num) != EOF) {
        int ret = 0;
        if(num<6)
        {
            printf("0\n");
        }
        else
        {
            for(int i = 6;i<=num;i++)
            {
                int tmp = 0;
                for(int j = 1;j<= i/2;j++)
                {
                    if(i%j == 0)
                    {
                        tmp += j;
                    }
                }
                if(tmp == i)
                {
                    ret++;
                }
            }
        }
        printf("%d\n",ret);
    }
    return 0;
}
发表于 2023-10-11 20:53:08 回复(0)
#include <stdio.h>
int isPerfect(int n)//判断是否为完全数
{
    int sum=0,flag=0;
    for(int i=1;i<=n/2;i++)
    {
        if(n%i==0)
            sum+=i;
    }
    if(n==sum)
        flag=1;
    return flag;
}
int main() {
    int n,count=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        if(isPerfect(i))
            count++;
    }
    printf("%d",count);
    return 0;
}
发表于 2023-09-04 21:44:27 回复(0)
#include <stdio.h>

int main()
{
        int n;
        scanf("%d", &n);
        if(n < 28)
        {
                printf("1");
        };
         if(n < 496 && n >= 28)
        {
                printf("2");
        };
         if(n < 8128 && n >= 496)
        {
                printf("3");
        };
        return 0;
}
发表于 2023-06-10 16:26:49 回复(0)
#include <stdio.h>
#include <math.h>

int wqs(int num){      //完全数判断函数,传入一个待判定的整型数

    int i, mid;
    mid = num;
    for(i = 1 ; i < sqrt(num) ; i++){
        if(num % i == 0){
            num = num + i + num / i;
        }
    }
    if(num == ( 3 * mid )){    //待判断数本身 + 因数和(包括了 “ 1 * 本身 ” 这种情况) = 3 * 待判断数
        return 1;
    }else{
        return 0;
    }
}

int main() {
    
    int n, i, num = 0;
    scanf("%d",&n);
    for(i = 1 ; i <= n ; i++){
        if(wqs(i)){                   //对1~n之间的数遍历调用判断函数,若判断为完全数,则将计数值自增一
            num ++ ;
        }
    }
   printf("%d",num + 1);
    return 0;
}

发表于 2023-04-12 13:30:43 回复(0)

define _CRT_SECURE_NO_WARNINGS

include

int main() {

int n = 0;

scanf("%d", &n);

int cnt = 0;

int sum = 0;

while (n) {

    sum = 0;

    for (int i = 1; i n; i++) {

        if (n % i == 0) {

            sum += i;

        }

        if (sum == n && i == n - 1) {

            cnt++;

            break;

        }

    }

    n--;

}

printf("%d", cnt);

return 0;

}

```
#define _CRT_SECURE_NO_WARNINGS
#include
int main() {
int n = 0;
scanf("%d", &n);
int cnt = 0;
int sum = 0;
while (n) {
sum = 0;
for (int i = 1; i < n; i++) {
if (n % i == 0) {
sum += i;
}
if (sum == n && i == n - 1) {
cnt++;
break;
}
}
n--;
}
printf("%d", cnt);
return 0;
}
调试了四五十分钟。终于调好了。

发表于 2023-03-15 17:44:03 回复(0)
#include <stdio.h>
#include <math.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    
    int i = 0;
    int factor = 0;//记录公因数
    int sum = 0;//记录公因数的和
    int count = 0;//记录完全数的个数
    for (i = 2; i <= n; i++)
    {
        sum = 1;//1是所有数的公因数
        for(factor = 2; factor <= sqrt(i); factor++)//当公因数大于数的平方根后会重复,不需要遍历
        {
            if (0 == i % factor)
            {
                sum += factor;
                if (factor != sqrt(i))//公因数与数的平方根相等时只能加一次
                    sum += (i / factor);
            }
        }
        if (sum == i)
            count++;
    }
    printf("%d\n", count);
    return 0;
}

发表于 2022-07-23 16:43:04 回复(0)
#include <stdlib.h>
#include <stdio.h>
  
int main(void)
{
    int n;
    scanf("%d",&n);
    int s = 1,i = 0;
    int count = 0;
    do
    {
        s = 1;
        for(i = 2; i < n/i; i++ )
        {
            if(n%i == 0)
            {
                s += (i+n/i);             
            }
            if(s > n) break;
        }
        if(s!= 1 && s == n )
        {
            count++;
        }
    }while(--n);
      
    printf("%d\n",count);
    return 0;
}

发表于 2022-06-18 11:34:09 回复(0)
#include<stdio.h>
#include<math.h>
int main() {
int num;
while(~scanf("%d", &num)){
    if(num==1){printf("0\n");break;}
    int count = 0;
    for(int i=2; i<=num; i++){
        int sum = 1,root = sqrt(i); // 求约数遍历到根值即可
        for(int j=2; j<=root; j++){
            if(i%j==0){
                sum +=j; //与约数j相加
                if(i!=root) //防止两个相同的约数重复计算
                    sum +=(i/j); //与约数j对应点另一个约数相加
            }
        }
        if(sum == i)count++;
    }
    printf("%d\n", count);
}
}

发表于 2022-03-29 20:32:28 回复(0)
#include<stdio.h>

int main()
{
    int n=0;
    while(~scanf("%d",&n))
    {
        int count = 0;
	    for (int i = 1; i<=n; i++)
	    {		
	    	int sum = 0;
            
	    	for (int j = 1; j<i; j++)
	    	{
                //只要整除就是约数,把约数相加
		    	if (i%j == 0)
		    	{
		    		sum += j;
		    	}
		    }
            //如果sum跟i相等就是完全数
	    	if (sum == i)
	    		count++;
	    }
	    printf("%d\n", count);
    }
        return 0;
}

发表于 2022-03-02 22:15:50 回复(2)
#include <stdio.h>

int Perfectnumber(int i)     //判断是否为完全数
{
	int sum = 0;
	for (int j = 1; j<i; j++)  //从1开始<i,直接忽略i本身
	{
		if (i%j == 0)
		{
			sum += j;   //约数相加
		}
	}
	if (sum == i)     //判断是否为完全数
		return 1;
	return 0;
}

int main()
{
	int n = 0;
	while (scanf("%d", &n) != EOF)  //多组输入
	{
		int count = 0;               //计数
		for (int i = 1; i <= n; i++)  //大循环,判断从 1 到 n
		{
			int ret = Perfectnumber(i); //判断一个数是否为完全数,返回1或0
			count += ret;               //是则计数+1
		}
		printf("%d\n", count);
	}
	return 0;
}

发表于 2022-02-19 19:41:31 回复(0)

问题信息

难度:
30条回答 30185浏览

热门推荐

通过挑战的用户

查看代码