新华林问题

新华林问题验证

问题描述:

\[对于质数p \ \ (p \neq 2,5,11) \]

\[必定存在\ \ p=x+y+z \]

\[使得\ \ x \ast y \ast z=w^3 (w \in N) \]

代码:(范围:1~10000)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <stack>
#include <set>
#include <cstring>
#include <conio.h>
#include <string>
#include <queue>
using namespace std;

typedef long long ll;

bool isprime[10005];
ll prime[5005];
ll top=1;

bool canfind(ll x)
{
	ll tx=ceil((long double)pow(x,(double)1/(double)3));
	// cout<<x<<" "<<tx<<endl;
	if(tx*tx*tx==x)
	{
		cout<<tx<<"^3		\t"<<x<<"		\t";
		return 1;
	}
	return 0;
}

int main(int argc, char const *argv[])
{
	freopen("write.txt","w",stdout);
	memset(isprime,1,sizeof(isprime));
	for(int i=2;i<10000;i++)
	{
		if(isprime[i])
			prime[top++]=i;
		for(int j=1;j<top;j++)
		{
			if(i*prime[j]>10000)
				break;
			isprime[i*prime[j]]=0;
			if(i%prime[j]==0)
				break;
		}
	}
		

	for(int i=1;i<top;i++)
	{
		ll k=prime[i]/3;
		bool ff=0;
		for(ll a=1;a<=k;a++)
		{
			if(ff)
				break;
			for(ll b=a;b<=(k<<1);b++)
			{
				ll cc=prime[i]-a-b;
				if(cc<0)break;
				if(canfind(a*b*cc))
				{
					cout<<prime[i]<<" = "<<a<<"+"<<b<<"+"<<cc<<endl;
					ff=1;
					break;
				}
			}
		}
		// getch();	
	}

	return 0;
}

posted @ 2019-09-29 21:25  WJSoj  阅读(400)  评论(2编辑  收藏  举报