解题思路:基本都是自定义函数用来判断亲密关系,再在主函数中遍历输出所有亲密数。思路不难,关键就是容易超时,你是循环3000次还是3000*3000次呢?这里如果不追求时间复杂度只追求代码逻辑,很容易犯我第一次犯的错误导致超时!
注意事项:
参考代码:
先给出最容易犯错的自定义函数法示例代码:
#include <stdio.h>
int love(int a,int b)
{
int sum1=0,sum2=0;
for(int i=1;i<=a/2;i++)
{
if(a%i==0) sum1=sum1+i;
}
for(int j=1;j<=b/2;j++)
{
if(b%j==0) sum2=sum2+j;
}
if (sum1==b&&sum2==a) return 1;
else return 0;
}//自定义亲密函数对
int main()
{
int a,b;
for(a=1;a<=3000;a++)
{
for(b=a+1;b<=3000;b++)
{
if ((love(a,b)==1))
{
printf("(%d,%d)",a,b);
}
}
}
return 0;
}
那么上面这段代码有任何问题吗?答案是几乎没有,完全能够得出正确结果。可惜太慢了,一定会超时!因为每调用一次love函数都是两次循环,而a和b还要循环嵌套,最后加上判断语句,非常复杂,我尝试过很多回,这段代码无论如何修正都会超时(如果不相信可以copy下来自己试一试),于是沮丧的我翻阅了其他人的代码块,忽然有了思路:亲密函数没必要追求一次性判断两个数并且输出数对,只要求出某个数因子,在主函数循环中将函数结果与循环体的值比较就可以了。这样会减少很多不必要的循环!示例代码如下:
#include<stdio.h>
int sum(int n);
int main(void)
{
int i;
int sum1, sum2;
for(i = 1; i <= 3000; i++)
{
sum1 = sum(i);
sum2 = sum(sum1);
if(sum2 == i&&i < sum1)//代表因子和数相同,且小的数在数对前面
printf("(%d,%d)", i, sum1);
}
return 0;
}
int sum(int n)
{
int i, sum = 0;
for(i = 1; i < n; i++)
if(n % i == 0)
sum+= i;
return sum;//不需要判断两数,直接简单求出一个数的因子
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复