很基础的题目但不够熟练,总是不能一套带走,这次写在这里给自己一个教训。
题目:
完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。
本题的任务是判断两个正整数之间完数的个数。
Input输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。
Output对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。
Sample Input2
2 5
5 7
Sample Output
0
1
直接贴代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include<cstdio> #include<iostream> #include<set> #include<iterator> using namespace std; bool blow_t(int n) ///判断n是否为完数并返回真值; { int i,sum = 0; bool wanshu = false; ///我们依旧立一个flag; for(i = 1; i <= n/2; i ++) ///遍历1 ~ n/2以内的数; { if(n % i == 0) { sum += i; ///如果i是n的因数,就加进sum; } } if(n == sum) ///如果sum==n,我们找对了,flag立起来; { wanshu = true; } return wanshu; } int main() { int N; cin >> N; while(N--) { int i,a,b,sum = 0; int t; cin >> a >> b; if(a > b) { swap(a,b); } for(i = a; i <= b; i ++) { if(blow_t(i)) { sum ++; } } cout << sum << endl; } return 0; } |