圣司


私信TA

用户名:uq_73405754848

访问量:1620

签 名:

立志成为高级工具人

等  级
排  名 9645
经  验 1085
参赛次数 0
文章发表 18
年  龄 18
在职情况 学生
学  校 南京邮电大学
专  业

  自我简介:

TA的其他文章

字符串反转
浏览:68

解题思路:
1.原先的思路是让i从1到3000验证,将i的因子(除了自己)全部加到a。

2.在这个循环里再让k从i+1开始验证到3000,将k的因子(除了自己),全部加到b

3.验证a==k&&b==i(但是这样太过麻烦!!)

修改:(i可以从220开始,最大因子也只能是自己的一半),但即便这样,运行时间也只是从30s减到15s 依然太慢。所以换个算法。

1.i从220到3000开始验证,将i的因子(除了自己)加到a

2.此时,假设因子之和a就是b

3.那么,下面求B(也就是a)除了自己之外的所以因子之和b。

4.验证b==i(验证一个即可 另外一个已经默认相等了)

5.左边比右边小,所以要添加一个i<a的条件。


注意事项:

参考代码:

#include<stdio.h>
int main()
{
	int i,j,k,t;
	int a=0,b=0;
	for(i=2;i<=3000;i++)
	{
		for(j=1;j<=i/2;j++)
		{
			if(i%j==0)
			{
				a+=j;
			}
		}
		for(k=i+1;k<=3000;k++)
		{
			for(t=1;t<=k/2;t++)
			{
				if(k%t==0)
				{
					b+=t;
				}
			}
			if(a==k&&b==i)
			{
				printf("(%d,%d)",i,k);
			}
			b=0;
		}
		a=0;
		
	}
	return 0;
}

换个算法之后

#include<stdio.h>
int main()
{
	int i,j,k,t;
	int a=0,b=0;
	for(i=220;i<=3000;i++)
	{
		for(j=1;j<=i/2;j++)
		{
			if(i%j==0)
			{
				a+=j;
			}
		}
		for(t=1;t<=a/2;t++)
		{
			if(a%t==0)
			{
				b+=t;
			}
		}
		if(b==i&&i<a)
		{
			printf("(%d,%d)",i,a);
		}
		b=0;
		a=0;	
	}
	return 0;
}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区