[蓝桥杯2016初赛]四平方和

本文介绍了一种解决特定数学问题的算法——寻找四个整数的组合,使得它们的平方和等于给定的目标数值。该算法通过双重循环进行优化,并使用了条件判断来减少不必要的计算,从而有效地解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
原题是要求一组一组的输入而不是多组输入,所以网上的大部分代码都没办法过,会超时。
如果是原题,这个代码可以过:

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
map<int,int>q;
int main()
{
   int n;
  scanf("%d",&n);
   
       for(int c=0;c*c<=n/2;c++)
	   {
	   	  for(int d=c;c*c+d*d<=n;d++)
	   	  {
	   	  	if(q.find(c*c+d*d)==q.end())  ///确保所取到的c是所有符合条件中最小的那一个
	   	  	q[c*c+d*d]=c;
		 }
		}
		int flag=0;
		for(int a=0;a*a<=n/4;a++)
		{
			for(int b=a;b*b+a*a<=n/2;b++)
			{
				if(q.find(n-b*b-a*a)!=q.end())
				{
					int c=q[n-b*b-a*a];
					int d=(int)(sqrt(n-a*a-b*b-c*c));
					printf("%d %d %d %d\n",a,b,c,d);
					flag=1;
					return 0;  //直接退出程序
				}
			}
		
		 } 
   
   return 0;	
} 

如果多组输入,下面的代码可以过:

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int flag=1;
		for(int a=0;a*a<=n/4 && flag;a++)
		{
			for(int b=a;b*b+a*a<=n/2 &&flag;b++)
			{
				for(int c=b;4*(a*a+b*b+c*c)<=n*3 &&flag;c++)
				{
					int t=n-a*a-b*b-c*c;
					double d=sqrt((double)t);
					if(fmod(d,1)==0&&(d>=c))
					{
						flag=0;
						printf("%d %d %d %d\n",a,b,c,(int)d);
					}
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值