您的位置:首页 > 编程语言 > C语言/C++

2016蓝桥杯C/C++省赛 四平方和(暴力,水题)

2017-03-25 15:37 99 查看
题目:



直接暴力就好。。
代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define N 5000000+20
#define M 1000000+10
#define LL long long
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int m=sqrt(n);
for(int a=0; a<=m; a++)
for(int b=a; b<=m; b++)
for(int c=b; c<=m; c++)
for(int d=c; d<=m; d++)
if(a*a+b*b+c*c+d*d==n)
{
printf("%d %d %d %d",a,b,c,d);
return 0;
}
return 0;
}
2018年03月29日17:10:02更新,可以采取更巧妙一点的方法#include <stdio.h>
#include <math.h>
int mpt[5000010] = {0}; //mpt[i] = 1表示i 能够用两个完全平方数相加而得。
int n;
void init()
{
for(int i = 0 ; i*i <= n ; i ++)
for(int j = 0 ; j*j <=n ; j ++)
if(i*i+j*j <= n) mpt[i*i+j*j] = 1;
}
int main()
{
int flag = false;
scanf("%d",&n);
init();
for(int i = 0 ; i * i <= n ; i ++)
{
for(int j = 0 ; j * j <= n ; j ++)
{
if(mpt[n - i*i - j*j] == 0) continue; //如果剩下的差用两个完全平方数不能组合出来就不继续
for(int k = 0 ; k * k <= n ; k ++)
{
int temp = n - i*i - j*j - k*k;
double l = sqrt((double) temp);
if(l == (int)l )
{
printf("%d %d %d %d\n",i,j,k,(int)l);
flag = true;
break;
}
}
if(flag)break;
}
if(flag)break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: