PDA

View Full Version : اشکال یابی کد



sa1378
پنج شنبه 26 تیر 1393, 19:06 عصر
سلام
این کد برای این سوال هست:
121217
اشکالش چیه که تا بینهایت ادامه پیدا میکنه و اعداد بی ربط میده؟
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
long long int x=0;
long long int y=0;
long long int jahat=0;
for(int i=1;i<=20;i++)
{
while (i%2==0)
{
jahat++ ;
i /=2;
}
switch (jahat%4){

case 0:
y +=i;
case 1:
x +=i;
case 2:
y-=i;
case 3:
x-=i;
}
cout<<x<<" "<<y<<endl;
}
cout<<x<<" "<<y<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

parvizwpf
پنج شنبه 26 تیر 1393, 19:53 عصر
شمارنده(i) رو داخل فور تفییر ندید این کار اشتباهی هست.

sa1378
جمعه 27 تیر 1393, 13:01 عصر
این کدی هست که خود آزمون برای این سوال داده
خروجی برنام من با این فرق داره
اشکال کد من چیه؟
و اگه میشه اینکد رو توضیح بدین که هر تابع یا اگه امکان داره هر کدش چیکار میکنه
# include <iostream>
# include <iomanip>
# include <string>
# include <algorithm>
# include <fstream>
# include <cstring>
# include <vector>
# include <set>
# include <queue>
# include <map>
# define PB push_back
# define FF first
# define SS second
using namespace std;
typedef long long LL;
typedef pair<long long,long long> PLL;
const LL DELTA=11287;
int dx[]={0,+1,0,-1};
int dy[]={+1,0,-1,0};

PLL Pos=PLL(0,0);
int dir;

void PRT(PLL X){cout<<"("<<X.FF<<","<<X.SS<<")"<<endl;}

PLL F(LL x)
{
LL T=0;
while(x%2==0){T++;x/=2;}
return PLL(T,x);
}
int main()
{
for(int i=1;i<=20;i++)
{
int K=F(i).FF;
int M=F(i).SS;
dir=(dir+K)%4;
Pos=PLL(Pos.FF+dx[dir]*M,Pos.SS+dy[dir]*M);
}
cout<<"Noghte Matloob = ";
PRT(Pos);
LL Ans=1;
for(int i=0;i<9;i++)
Ans=(Ans*Pos.FF*Pos.SS)%DELTA;
cout<<"Javab e Alef = "<<(Ans+DELTA)%DELTA<<endl;
return 0;
}

مسعود اقدسی فام
جمعه 27 تیر 1393, 18:01 عصر
این کدی هست که خود آزمون برای این سوال داده
خروجی برنام من با این فرق داره
اشکال کد من چیه؟
و اگه میشه اینکد رو توضیح بدین که هر تابع یا اگه امکان داره هر کدش چیکار میکنه


منظور از pair زوج مرتبی از هدر map هست که می‌تونید اطلاعات (اینجا هر دو از جنس long int) رو به صورت دو تایی ذخیره کنید. Pos‌ متغیری از این جنسه که مختصات رو نگه می‌داره. دو تا آرایه‌ی dx و dy تغییر مختصات در صورت حرکت به بالا، راست، پایین و چپ رو (به ترتیب) مشخص می‌کنه. یعنی وقتی بالا حرکت انجام بشه (عنصر صفر دو آرایه) x تغییر نمی‌کنه و y یه واحد اضافه می‌شه. تابع F هم یه عدد می‌گیره و مقدار M‌ و K رو براش حساب می‌کنه و به صورت یه زوج بر می‌گردونه.
داخل حلقه‌ی for‌ تابع main بیست گام حرکت (dir از روی K و تعداد حرکت با ضرب M در عنصر dirم آرایه‌های dx و dy) انجام می‌شه و در ادامه توان نهم عبارت محاسبه و باقیمانده بر DELTA چاپ می‌شه.

هدرفایلایی که اون بالا اضافه شده لزوما اینجا کاربرد ندارن. فقط iostream و map استفاده می‌شه. دلیل نوشته شدنشون اینه که زمان برگزاری مسابقات حین کدنویسی ممکنه یه نفر به هر کدوم از این هدرهای پرکاربرد نیاز داشته باشه. به همین خاطر این موارد رو همون اول بالا تایپ می‌کنه (و برای سوالات بعدی فقط کپی می‌کنه) تا کمی سرعت کار بالا بره.

مسعود اقدسی فام
جمعه 27 تیر 1393, 18:19 عصر
سلام
این کد برای این سوال هست:
اشکالش چیه که تا بینهایت ادامه پیدا میکنه و اعداد بی ربط میده؟
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
long long int x=0;
long long int y=0;
long long int jahat=0;
for(int i=1;i<=20;i++)
{
while (i%2==0)
{
jahat++ ;
i /=2;
}
switch (jahat%4){

case 0:
y +=i;
case 1:
x +=i;
case 2:
y-=i;
case 3:
x-=i;
}
cout<<x<<" "<<y<<endl;
}
cout<<x<<" "<<y<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}


این کد دو تا مشکل داره.

۱- همونطور که دوستمون هم گفتن نباید i رو داخل حلقه تغییر بدید. یرای حل مشکل یه متغیر دیگه داخل حلقه تعریف کنید و شروع هر تکرار، مقدار i‌ رو داخلش بریزید و محاسبات رو با اون انجام بدید. وقتی مقدار i‌ عوض می‌شه (اینجا کم می‌شه) طبیعتا هیچ وقت به بیست نمی‌رسه و حالت حلقه‌ی بی‌نهایت پیدا می‌کنه.
۲- آخر هر case یدونه break بذارید.

sa1378
شنبه 28 تیر 1393, 11:11 صبح
کد رو به این صورت تغییر دادم:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
long long int x=0;
long long int y=0;
long long int jahat=0;
for(int i=1;i<=20;i++)
{
long int q=i;
while (q%2==0)
{
jahat++ ;
q /=2;
}
switch (jahat%4){

case 0:
y +=q;
break;
case 1:
x +=q;
break;
case 2:
y-=q;
break;
case 3:
x-=q;
break;
}
}
cout<<x<<" "<<y<<endl;
long long int x2=1,y2=1;

for(int p1=1;p1<=9;p1++)
x2=(x2*x)%11287;
for(int p2=1;p2<=9;p2++)
y2=(y2*y)%11287;


long long int z=(x2*y2)%11287 ;
cout<<z<<endl;



system("PAUSE");
return EXIT_SUCCESS;
}

x,y اش درست شده ولی توی محاسبه توان بزرگ نمیتونه کار کنه
جواب اصلی شده 7 هزار و خوردی
ولی مال من شده -3 هزار و خوردی

مسعود اقدسی فام
شنبه 28 تیر 1393, 12:02 عصر
x,y اش درست شده ولی توی محاسبه توان بزرگ نمیتونه کار کنه
جواب اصلی شده 7 هزار و خوردی
ولی مال من شده -3 هزار و خوردی


از نظر ریاضی و مفاهیم همنهشتی و باقیمانده، عدد منفی سه هزار و چند و مثبت هفت هزار و چند یه باقیمانده برای 11287 هستن. کافیه اولی رو یه بار با 11287 جمع بزنید تا تبدیل به هفت هزار و چند بشه.