一道简单的代数题目

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亿内的所有组合。


...全文
3889 点赞 收藏 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); }
}
}
}
}
}
}
考验你机子的时候到了,^_^
回复 点赞
learnonedelisonedel 2008年11月14日
mark...
回复 点赞
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.0w+

社区成员

3.4w+

社区内容

数据结构与算法相关内容讨论专区
社区公告
暂无公告