|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
#include<stdio.h>
int main()
{
int same(int c);
int a,b;
for(a=2;a<3000;a++)
for(b=3;b<=3000;b++)
{
while(same(a)==b&&same(b)==a&&b>a)
printf("(%d,%d) ",a,b);
}
return 0;
}
int same(int c)
{
int n,m=0;
for(n=1;n<c;n++)
{
while(c%n==0)
m=m+n;
}
return m;
}
本帖最后由 jackz007 于 2025-2-25 21:21 编辑
楼主最大的问题是没有搞清楚 if 与 while 的区别,if 是条件判断,而 while 是循环。前者根据布尔表达式的值控制程序运行的走向,后者会根据布尔表达式的值决定是否继续循环。楼主就是在代码中 2 处本来应该使用 if 的地方错用了 while,导致程序陷入死循环,从而无法看到运行结果。
- #include<stdio.h>
- int same(int c) // 函数前置,调用前不必声明
- {
- int n , m = 0 ;
- for(n = 1 ; n < c ; n ++) {
- if(c % n == 0) m = m + n ; // 这里有错,不可以用 while,肯定会死循环
- }
- return m ;
- }
- int main(void) // main() 函数放到最后,可以最大限度避免函数声明
- {
- int a , b ;
- for(a = 2 ; a < 3000 ; a ++) { // 单层循环驱动即可,不可以用双层循环嵌套
- b = same(a) ; // 函数定义已经前置,调用前不必进行声明
- if(a < b && same(b) == a) printf("%4d , %4d\n" , a , b) ; // 这里有错,不可以用 while,肯定会死循环
- }
- return 0 ;
- }
复制代码
编译、运行实况
- D:\[exercise]\C>g++ -o x x.c
- D:\[exercise]\C>x
- 220 , 284
- 1184 , 1210
- 2620 , 2924
- D:\[exercise]\C>
复制代码
|
|