Primes 求原始勾股三元组的算法

Primes 求原始勾股三元组的算法,primes,primitive,pythagorean,Primes,Primitive,Pythagorean,这是我的密码: //PPT.cpp:定义控制台应用程序的入口点。 // #包括“stdafx.h” #包括 #包括 #定义下界1 #定义上界20 结构ppt { int v1; int v2; int v3; ppt*下一步; }; 类型定义结构ppt ppt; 类型定义PPT*PPT_ptr; 无效插入(ppt_ptr*h_ptr、ppt_ptr*t_ptr、int u1、int u2、int u3); 作废打印ppt(ppt\u ptr curr\u ptr); int是_素数(int n)

这是我的密码:

//PPT.cpp:定义控制台应用程序的入口点。
//
#包括“stdafx.h”
#包括
#包括
#定义下界1
#定义上界20
结构ppt
{
int v1;
int v2;
int v3;
ppt*下一步;
};
类型定义结构ppt ppt;
类型定义PPT*PPT_ptr;
无效插入(ppt_ptr*h_ptr、ppt_ptr*t_ptr、int u1、int u2、int u3);
作废打印ppt(ppt\u ptr curr\u ptr);
int是_素数(int n);
int是勾股三元组(intv1,intv2,intv3);
int不同的三元组(int v1、int v2、int v3、int u1、int u2、int u3);
int是精确的倍数(int p,int q,int r,int l,int m,int n);
int是唯一且可插入的(ppt\u ptr curr\u ptr、int v1、int v2、int v3);
//====================================================================
int _tmain(int argc,_TCHAR*argv[]
{
ppt_ptr head_ptr=NULL;
ppt_ptr tail_ptr=NULL;
对于(int a=下界;a v3=u3;
新建\u ptr->next=NULL;
如果(*h_ptr==NULL)
{
*h_ptr=新的_ptr;
}
其他的
{
(*t_ptr)->next=new_ptr;
}
*t_ptr=新的_ptr;
}
其他的
{
printf(“%d%d%d未插入。没有可用内存。\n”,u1、u2、u3);
}
}
此函数用于打印列表

void print\u ppt(ppt\u ptr curr\u ptr)
{
if(curr_ptr==NULL)
{
printf(“列表为空。\n\n”);
}
其他的
{
while(curr_ptr!=NULL)
{
printf(“%d%d%d\n”,curr\u ptr->v1,curr\u ptr->v2,curr\u ptr->v3);
当前值=当前值->下一步;
}
}
}
此函数用于确定数字是否为素数

//函数1
int是素数(int n)
{
int num_of_factors=0;
int i=1;
对于(i=1;iv1,当前ptr->v2,当前ptr->v3);
int u1=当前值->v1;
int u2=当前值->v2;
int u3=当前值->v3;
如果((不同的三元组(v1、v2、v3、u1、u2、u3))和
(!是精确的倍数(v1,v2,v3,u1,u2,u3)))
{
printf(“%d%d%d\n”,curr\u ptr->v1,curr\u ptr->v2,curr\u ptr->v3);
返回1;
}
//printf(“yoyoyo”);
当前值=当前值->下一步;
}
}
返回0;
}
此函数确定三元组是否唯一

//定义:此函数检查和是否是不同的三元组
//如果它们是不同的三元组,则返回1。
int不同的三元组(int v1、int v2、int v3、int u1、int u2、int u3)
{
如果(v1==u1&&v2==u2&&v3==u3)
返回0;
else if(v1==u1&&v2==u3&&v3==u2)
返回0;
else if(v1==u2&&v2==u1&&v3==u3)
返回0;
否则如果(v1==u2&&v2==u3&&v3==u1)
返回
else if(v1==u3&&v2==u2&&v3==u1)
返回0;
else if(v1==u3&&v2==u1&&v3==u2)
返回0;
其他的
返回1;
}
此函数用于确定三元组是否为三元组的倍数

//此函数测试三元组是否是的任意顺序的精确倍数
//(排列/排列)
int是精确的倍数(int v1、int v2、int v3、int u1、int u2、int u3)
{
如果(v1%u1==0&&v2%u2==0&&v3%u3==0)
返回1;
否则如果(u1%v1==0&&u2%v2==0&&u3%v3==0)
返回1;
否则如果(v1%u1==0&&v2%u3==0&&v3%u2==0)
返回1;
否则如果(u1%v1==0&&u2%v3==0&&u3%v2==0)
返回1;
否则如果(v1%u2==0&&v2%u1==0&&v3%u3==0)
返回1;
否则如果(v1%u2==0&&v2%u3==0&&v3%u1==0)
返回1;
否则如果(u1%v2==0&&u2%v1==0&&u3%v3==0)
返回1;
否则如果(u1%v2==0&&u2%v3==0&&u3%v1==0)
返回1;
否则如果(v1%u3==0&&v2%u2==0&&v3%u1==0)
返回1;
否则如果(v1%u3==0&&v2%u1==0&&v3%u2==0)
返回1;
否则如果(u1%v3==0&&u2%v2==0&&u3%v1==0)
返回1;
否则如果(u1%v3==0&&u2%v1==0&&u3%v2==0)
返回1;
其他的
返回0;
}

我知道算法没有优化…我稍后会这样做。有人能帮我让这个代码正常工作吗。

你的函数
是唯一的且可插入的
大概应该检查列表中是否已经存在一个等价的三元组(相同的数字以不同的顺序排列)或者新的三元组是一个倍数(模置换)列表中的三元组。但它只将新三元组与第一个列表元素进行比较,函数中没有循环语句或递归

int是唯一且可插入的(ppt\u ptr curr\u ptr,int v1,int v2,int v3)
{
if(curr_ptr==NULL)
{
//printf(“列表为空。\n\n”);
}
其他的
{
if(curr_ptr!=NULL)
{
//printf(“%d%d%d\n”,curr\u ptr->v1,curr\u ptr->v2,curr\u ptr->v3);
int u1=当前值->v1;
int u2=当前值->v2;
int u3=当前值->v3;
如果((不同的三元组(v1、v2、v3、u1、u2、u3))和
(!是精确的倍数(v1,v2,v3,u1,u2,u3)))
{
printf(“%d%d%d\n”,curr\u ptr->v1,curr\u ptr->v2,curr\u ptr->v3);
返回1;
}
//printf(“yoyoyo”);
当前值=当前值->下一步;
}
}
返回0;
}
如果使用
while(curr_ptr!=NULL)
,则可以将其与第一个元素进行比较。但是,它仍然具有错误的逻辑,只要找到不同的三元组,它就会返回true(1)。新的三元组不是的倍数

逻辑必须反过来,如果遇到等效的三元组(或新的三元组是的倍数),则返回false(0),只有在遍历整个列表时未遇到此类三元组,才返回true:

int是唯一且可插入的(ppt\u ptr curr\u ptr,int v1,int v2,int v3)
{
while(curr_ptr!=NULL)
{
int u1=当前值->v1;
int u2=当前值->v2;
int u3=当前值->v