东华oj-基础题第32题

32 完数个数

作者: xxx时间限制: 1S章节: 循环

问题描述 :

完数的定义:如果一个大于1的正整数的所有真因子(不包括自己的那些因子)之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。

本题的任务是判断两个正整数之间完数的个数。

输入说明 :

第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000)

输出说明 :

对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。 输入范例 : 3 2 9999 4305
4135 5186 91 输出范例 : 4 0 1

/*
	T32 完数个数 
	算法概述:从1到num / 2累加数num的因数(不考虑num本身),
	若出现了和等于num,则将完数个数加1
*/ 

#include<stdio.h>

// 判断是否为完数,是完数返回1,否则返回0 
int isPerfect(int x) { 
	int sum = 0, i = 0;
	
	for (i = 1; i <= x / 2; i++) {
		if (x % i == 0) {// i为x的因数 
			sum += i;
		}
	}
	
	if (sum == x) {
		return 1;
	} 
	else {
		return 0;
	}
}
	
int main() {
	int n = 0;// 测试数据组数
	int num1 = 0, num2 = 0;
	int i = 0; 
	int count = 0;// 统计完数个数 
	int temp = 0;
	
	scanf("%d", &n);
	while (n) {
		scanf("%d %d", &num1, &num2);
		if (num1 > num2) {// 让第一个数总是比第二个数小 
			temp = num1;
			num1 = num2;
			num2 = temp;
		}
		
		count = 0;// 重置计数 
		for (i = num1; i <= num2; i++) {
			if (isPerfect(i) == 1) {
				count++;
			} 
		}
		printf("%d\n", count);
		
		n--;
	} 
	
	return 0;
}
发布了34 篇原创文章 · 获赞 6 · 访问量 6116

猜你喜欢

转载自blog.csdn.net/qq_41409120/article/details/104072056