一道简单的代数题目

northwolves 2008-11-02 12:33:25
加精
1. 四个不同自然数a<b<c<d 满足a^2+b^2+c^2+d^2=abcd,列出1亿内的所有组合。

2. n个不同自然数a1<a2<....<an 满足a1^2+a2^2+....+an^2=a1*a2*...*an,列出1亿内的所有组合。


...全文
4235 174 打赏 收藏 转发到动态 举报
写回复
174 条回复
切换为时间正序
请发表友善的回复…
发表回复
nsj168 2012-03-06
  • 打赏
  • 举报
回复
太不好试算了
半天找到一个2,6,22,262
jdtxse 2010-05-16
  • 打赏
  • 举报
回复
学习了
dike2018 2010-01-18
  • 打赏
  • 举报
回复
好啊
versacexw 2008-11-18
  • 打赏
  • 举报
回复
好难啊 !!!
zhangshouyi 2008-11-18
  • 打赏
  • 举报
回复
x 不出来捏 。。。。。。。。。。。。。。。。。。
hotrice 2008-11-18
  • 打赏
  • 举报
回复
厉害,感觉应该用数论的方法来分析会比较好,可惜我不熟
liguangwen86 2008-11-18
  • 打赏
  • 举报
回复
up
real_name 2008-11-18
  • 打赏
  • 举报
回复
不简单啊
ziqizhulin 2008-11-18
  • 打赏
  • 举报
回复
貌似第一题有点类似与水仙花束啊!不过还是不会解,看了下,貌似有点难懂
ZKM_ZHANG 2008-11-18
  • 打赏
  • 举报
回复
up
ljily000 2008-11-17
  • 打赏
  • 举报
回复
看似简单的问题,算法真多!
fengwenqi 2008-11-17
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <gmp.h>
#include <math.h>
#include <set>
using namespace std;
#ifndef N
#define N 4
#endif
#define MAX_COUNT 10000
typedef struct sDataEntry{
mpz_t datas[N];
mpz_t nc;
sDataEntry(){
int i;
for(i=0;i<N;i++)mpz_init(datas[i]);
mpz_init(nc);
}
sDataEntry(const sDataEntry& d){
int i;
for(i=0;i<N;i++)mpz_init(datas[i]);
mpz_init(nc);
for(i=0;i<N;i++){
mpz_set(datas[i],d.datas[i]);
}
mpz_set(nc,d.nc);
}
~sDataEntry(){
int i;
for(i=0;i<N;i++)mpz_clear(datas[i]);
mpz_clear(nc);
}
void set_nc(){
int i;
mpz_t tmp;
mpz_init(tmp);
mpz_set_ui(nc,0);
for(i=0;i<N;i++){
mpz_mul(tmp,datas[i],datas[i]);
mpz_add(nc,nc,tmp);
}
mpz_clear(tmp);
}
bool operator<(const struct sDataEntry& s)const{
int i;
int c=mpz_cmp(nc,s.nc);
if(c!=0)return c<0;
for(i=N-1;i>=0;i--){
int c=mpz_cmp(datas[i],s.datas[i]);
if(c!=0)return c<0;
}
return false;
}
bool operator==(const struct sDataEntry& s)const{
int i;
for(i=N-1;i>=0;i--){
int c=mpz_cmp(datas[i],s.datas[i]);
if(c!=0)return false;
}
return true;
}
}DataEntry;

set<DataEntry> results;

DataEntry t;
int td[N];
void search_last()
{
long long mul=1LL;
long long sum=0LL;
int i;
if(td[N-3]==1)return;///No solution available
for(i=0;i<N-2;i++){
mul*=td[i];
sum+=(long long)td[i]*td[i];
}
if(mul<=2LL)return;///No solution available;
long long d=sum/(mul-2LL);
int up=(int)sqrt(d+0.01);
for(i=td[N-3];i<=up;i++){
td[N-2]=i;
long long a=sum+(long long)i*i;
long long b=mul*i;
long long c=b*b-4*a;
if(c<0)continue;
int u=(int)sqrt((double)c);
if(u*(long long)u<c)u=u+1;
if(u*(long long)u==c){///Found a solution now
if((b-u)&1)continue;///Invalid
td[N-1]=(int)((b-u)/2);
int j;
for(j=0;j<N;j++){
mpz_set_ui(t.datas[j],td[j]);
}
t.set_nc();
results.insert(t);
}
}
}

void search(int last)
{
int i;
if(last==N-2){
search_last();
return;
}
long long mul=1LL;
long long mul2;
double ub;
for(i=0;i<last;i++){
mul*=td[i];
}
if(mul>N)return;
ub=pow((double)N/(double)mul,1.0/(N-2-last))+0.01;
i=1;if(last>0)i=td[last-1];
for(;i<=(int)ub;i++){
td[last]=i;
search(last+1);
}
}
int tcount=0;
void dump(const DataEntry& d)
{
int i;
for(i=0;i<N-1;i++){
if(mpz_cmp(d.datas[i],d.datas[i+1])==0)return;
}
for(i=0;i<N;i++){
mpz_out_str(stdout,10,d.datas[i]);
printf("\t");
}
printf("\n");
}

bool gens(const DataEntry& d)///return false when tcount reaches MAX_COUNT
{
mpz_t sum;
mpz_t tmp;
mpz_init(sum);mpz_init(tmp);
int i,j;
mpz_set_ui(sum,0);
for(i=0;i<N;i++){
mpz_mul(tmp,d.datas[i],d.datas[i]);
mpz_add(sum,sum,tmp);
}
for(i=0;i<N;i++){
if(i>0&&mpz_cmp(d.datas[i],d.datas[i-1])==0)
continue;
mpz_mul(tmp,d.datas[i],d.datas[i]);
mpz_sub(tmp,sum,tmp);
mpz_div(tmp,tmp,d.datas[i]);
if(mpz_cmp(tmp,d.datas[N-1])>0){
for(j=0;j<i;j++){
mpz_set(t.datas[j],d.datas[j]);
}
for(j=i;j<N-1;j++){
mpz_set(t.datas[j],d.datas[j+1]);
}
mpz_set(t.datas[j],tmp);
t.set_nc();
set<DataEntry>::iterator lit;
lit=results.find(t);
if(lit==results.end()){
results.insert(t);
tcount++;
}
}
}
mpz_clear(sum);mpz_clear(tmp);
return tcount<MAX_COUNT;
}

void gen_more()
{
set<DataEntry>::iterator it;
for(it=results.begin();it!=results.end();++it){
if(!gens(*it))
break;
}
mpz_t maxt;
mpz_init(maxt);
mpz_set(maxt,it->nc);
set<DataEntry>::iterator nit;
for(nit=results.begin();nit!=results.end();++nit){
if(mpz_cmp(nit->datas[N-1],maxt)<=0)
dump(*nit);
}
mpz_clear(maxt);
}

int main()
{
int i;
search(0);
set<DataEntry>::iterator it;
gen_more();
}
yezi2ding 2008-11-16
  • 打赏
  • 举报
回复
楼上的都是老师 学习
wgt2008 2008-11-15
  • 打赏
  • 举报
回复
顶,谁这么无聊啊!
Larry316 2008-11-15
  • 打赏
  • 举报
回复
up
jacky87 2008-11-15
  • 打赏
  • 举报
回复
慢慢研究学习中
北极夕阳 2008-11-14
  • 打赏
  • 举报
回复
太好了,慢慢学习
jjqf_2008 2008-11-14
  • 打赏
  • 举报
回复
看来得继续好好学习数学。。。。
ksharer 2008-11-14
  • 打赏
  • 举报
回复
public class Test1 {
public static void main(String[] args) {
int a,b,c,d;
for(a=2;a<100;a += 2) {
b=a+2;
for(;b<10000;b += 2) {
c=b+2;
for(;c<10000;c += 2) {
d=c+2;
for(;d<100000;d += 2) {
if(a*a+b*b+c*c+d*d == a*b*c*d) {
System.out.println("a:"+a+" b:"+b+"c:"+c+"+" d:"+d); }
}
}
}
}
}
}
考验你机子的时候到了,^_^
  • 打赏
  • 举报
回复
mark...
加载更多回复(154)
相关推荐

32,928

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告