View Full Version : سه تایی فیثاغورثی
h_c2005
شنبه 24 شهریور 1386, 11:19 صبح
با سلام خدمت دوستان عزیز
من یه برنامه نوشتم که تمام سه تاییهای قیثاغورث رو تا 500 پیدا میکنه. اما یه ارور میده که من متوجه نمیشم اشکال کار از کجاست .
می خواستم کمکم کنید .
با تشکر
این هم کد :
#include <iostream.h>
#include <math.h>
int main()
{
int side1,side2;
double hypotenuse;
double sqrt1=sqrt(hypotenuse);
for(side1 = 1;side1 <= 500;side1++)
{
for(side2 = 1;side2 <= 500;side2++)
{
hypotenuse = pow(side1,2)+pow(side2,2);
if ((sqrt1%2) == 0)
cout<<"("<<side1<<","<<side2<<","<<hypotenuse<<")"<<endl;
}
}
return 0;
}
این هم ارور :
error C2296: '%' : illegal, left operand has type 'double'
emad_67
شنبه 24 شهریور 1386, 14:53 عصر
sqrt1 یه مقدار double هست و به دست اوردن باقیمونده اون به 2 معنی نداره یعنی دو طرف عملگر % باید int باشن
پس اینجوری بنویس
int(sqrt1)%2==0;
h_c2005
شنبه 24 شهریور 1386, 22:15 عصر
من برنامه رو این جوری نوشتم اما تمام اعداد را چاپ می کنه و دستور if فایده ای نداره چون دیگه همه شرطها رو درست میگیره .
#include <iostream.h>
#include <math.h>
int main()
{
int side1,side2;
double hypotenuse=0;
double sqrt1=sqrt(hypotenuse);
for(side1 = 1;side1 <= 10;side1++)
{
for(side2 = 1;side2 <= 10;side2++)
{
hypotenuse= pow(side1,2)+pow(side2,2);
if (int(sqrt1)%2 == 0)
cout<<"("<<side1<<","<<side2<<","<<hypotenuse<<")"<<endl;
}
}
return 0;
}
میشه یه کم واسم توضیح بدین .
با تشکر
emad_67
شنبه 24 شهریور 1386, 23:07 عصر
من درست متوجه نشدم که چرا جذر hypotenuse رو گرفتی
شما توی این قمست:
double hypotenuse=0;
double sqrt1=sqrt(hypotenuse);
به hypotenuse مقدار 0 دادین و بعد ازش جذر گرفتین که جذر اون هم 0 میشه . در شرط if همواره باقیمونده 0 بر 2 برابر 0 میشه و شرط همیشه درست در میاد.
در کل توی سه تا حلقه for راحت میشه حسابش کرد. من اینو نوشتم
#include <iostream.h>
#include <math.h>
bool check(int,int,int);
void main()
{
for(int i=1;i<=500;i++)
{
for(int j=1;j<=500;j++)
{
for(int k=1;k<=500;k++)
{
if(check(i,j,k))
cout<<"side 1 = "<<i<<" "<<"side 2 = "<<j<<" "<<"hypotenuse = "<<k<<endl;
}
}
}
}
bool check(int side1,int side2,int hyp)
{
double a=pow(side1,2)+pow(side2,2);
double b=pow(hyp,2);
if(a==b)
return 1;
else
return 0;
}
فکر میکنم واضح باشه ولی به هر حال اگه سوالی بود در خدمتم.
SMRAH1
جمعه 30 شهریور 1386, 16:29 عصر
من برنامه شمارو مقداری تغییردادم و در VC هم کامپایل کردم و جواب گرفتم
#include <iostream.h>
#include <math.h>
int main()
{
int side1,side2;
double hypotenuse=0;
double sqrt1;
for(side1 = 1;side1 <= 10;side1++)
{
for(side2 = 1;side2 <= 10;side2++)
{
hypotenuse= pow(side1,2)+pow(side2,2);
sqrt1=sqrt(hypotenuse);
if (sqrt1 == (double)(int)sqrt1)
cout<<"("<<side1<<","<<side2<<","<<sqrt1<<")"<<endl;
}
}
return 0;
}
موفق باشی
pckho0r
دوشنبه 26 تیر 1391, 16:53 عصر
میدونم تاپیک فسیل شده است و لزومی به بالا اومدن نداره ولی چون الگوریتم این مسئله سوال خودم هم بود و گفتم شاید بعدها سوال کس دیگری هم باشه لازم دیدم جواب صحیح رو اینجا قرار بدم!
متاسفانه هیچکدوم از الگوریتم های داخل تاپیک درست نیست!
الگوریتم صحیحی که تست شده و و جواب قطعی میده:
#include <iostream>
using namespace std;
int main()
{
int vatar;
for(int i = 1; i <= 500; i++)
for(int j = 1; j <= 500; j++)
{
vatar = (i * i) + (j * j);
for(int k = 1; k <= vatar; k++)
if(vatar == k * k)
{
cout << i << " " << j << " " << k << endl;
break;
}
}
system("pause");
return 0;
}
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.