-
الإعلانات
-
تسجيل عضوية جديدة في المنتدى 01/31/2016
السلام عليكم ورحمة الله وبركاته عزيزي العضو الجديد : حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة ) فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK) وقم بتفعيل إشتراككم من هناك
-

khatibe_30
اعضاء-
عدد المشاركات
139 -
تاريخ الانضمام
-
تاريخ اخر زياره
كل شيء نشر بواسطة khatibe_30
-
نتيجة السؤال الخامس من مسابقة الفريق العربي للبرمجة -5
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
//solution: 5513936,5825243 //Language: C #include <stdio.h> #include <stdlib.h> double nbrs[] = {845, 7415, 415, 15, 852, 85145}; double nbrs2[] = {412, 665, 4215, 412, 62, 9514}; char ops[6] = {0}; void calc(int level, double result, int * gotit) { double res = 0; if(level == 6){ if(result == 46375267) *gotit = 1; return; } ops[level] = '+'; res = result + nbrs[level]; calc(level +1, res, gotit); if(*gotit) return; ops[level] = '-'; res = result - nbrs[level]; calc(level +1, res, gotit); if(*gotit) return; ops[level] = '*'; res = result * nbrs[level]; calc(level +1, res, gotit); if(*gotit) return; ops[level] = '/'; res = result / nbrs[level]; calc(level +1, res, gotit); if(*gotit) return; } void main() { int gotit = 0; double result = 8541; calc(0, result, &gotit); result = 8961; for(gotit = 0; gotit < 6; gotit++){ switch(ops[gotit]){ case '+':result += nbrs2[gotit];break; case '-':result -= nbrs2[gotit];break; case '*':result *= nbrs2[gotit];break; case '/':result /= nbrs2[gotit];break; } } printf("%.7f\n", result); system("pause"); } -
نتيجة السؤال الرابع من مسابقة الفريق العربي للبرمجة -4
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
//solution: 332640 //Language: C #include <stdio.h> #include <stdlib.h> #define ull unsigned long long ull dists[8] = {300000000, 600000000, 900000000, 1200000000, 1500000000, 1800000000, 2100000000, 2400000000}; ull path[8] = {0}; ull speeds[8] = {5000000/3, 10000000/4, 15000000/6, 20000000/7, 25000000/8, 10000000/3, 35000000/11, 40000000/12}; void main() { ull i, days = 1, isAligned = 0; double pcnt; while(!isAligned || days <= 2){ days++; for(i = 0; i < 8; i++) path += speeds; isAligned = 1; pcnt = ((double)(path[0] % dists[0]) / dists[0]) * 100; for(i = 1; i < 8; i++){ if((int)pcnt != (int)(((double)(path % dists) / dists) * 100)) { isAligned = 0; break; } } } printf("%llu\n", days); system("pause"); } -
نتيجة السؤال الثالث من مسابقة الفريق العربي للبرمجة -3
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
#include <stdio.h> #include <stdlib.h> int gcd_sum(int numbers[400]) { int i, j, gcd, sum = 0; for(i = 0; i < 399; i += 2) { for(j = i + 2; j < 399; j += 2) { gcd = (numbers < numbers[j])? numbers : numbers[j]; while((numbers%gcd) || (numbers[j]%gcd)) gcd -= 2; sum += gcd; } } return sum; } void main() { int i, numbers[400]; for(i = 0; i<400; i++) numbers = i + 2; printf("%d\n", gcd_sum(numbers)); system("pause"); }- 6 ردود
-
1
-
نتيجة السؤال الثاني من مسابقة الفريق العربي للبرمجة-2
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
جيد يا مصطفى.... للأسف أنا لم أحاول حتى أن أفكر في حل رياضي, قد يؤلمني رأسي ان فعلت :wacko: ,,, لذلك دالة تراجعية بسيطة + تخزين النتائج لتفادي التكرار و الى الأمام :D -
نتيجة السؤال الثاني من مسابقة الفريق العربي للبرمجة-2
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
#include <stdio.h> #include <stdlib.h> #define ull unsigned long long ull loz[40][40][40] = {{{0}}}; ull calc(int length, int ones, int zeroes) { ull n = 0; if(length == 1) return 1; if(ones > 0) { if(!loz[length - 1][ones - 1][zeroes]) loz[length - 1][ones - 1][zeroes] = calc(length - 1, ones - 1, zeroes); n += loz[length - 1][ones - 1][zeroes]; } if(zeroes > 0) { if(!loz[length - 1][ones][zeroes - 1]) loz[length - 1][ones][zeroes - 1] = calc(length - 1, ones, zeroes - 1); n += loz[length - 1][ones][zeroes - 1]; } return n; } void main() { printf("%llu\n", calc(40, 20, 20)); system("pause"); } -
السؤال الثاني من مسابقة الفريق العربي للبرمجة-2
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
نعم أخي مصطفى.. لكن ليس و كأنه يوجد مجال للنقاش أو الإقتراحات -_- الفضول يقتلني حتى أرى محاولتك يا رجل,,سيكون الكود الخاص بك خارقا طبعا, كان علي أن لا اشارك :D -
السؤال الثاني من مسابقة الفريق العربي للبرمجة-2
khatibe_30 رد على أحمد أبو عبد البر's موضوع في المسابقات البرمجية
السلام عليكم اخي هل يمكنك وضع حل لمثال بسيط حتى يستطيع المشاركون التأكد من صحة حلولهم قبل ارسالها المهم, تم ارسال الحل و لكن حاليا لا أستطيع التأكد من صحته قد لا تمانع ان قلت انه حسب محاولتي: في سلسلة بطول 20 حرفا, و بتكرار الـ واحد 9 مرات و الـ صفر 11 مرة وجدت النتيجة = 167960 و في سلسلة بطول 8 أحرف, و بتكرار الـ واحد 4 مرات و الـ صفر 4 مرات وجدت النتيجة = 70 صحيح أم خطأ؟؟ تحياتي -
كيف تقيّم مستواك كمبرمج في مجال الرياضيات والخوارزميات ؟
khatibe_30 رد على مصطفى 36a2's موضوع في الرياضيات والخوارزميات
و عليكم السلام و رحمة الله و بركاته هذا شيء مهم جدا لكل مبرمج يريد ان يطور نفسه لكن انا راحت علي يا حبيبي.....انشغلت بالمشاغل و ابتعدت عن هالامور الى ان صرت حاسس ان دماغي صار ثقيل و يجيني صداع لما احاول احل اي مشكلة :wacko: -
#include <stdlib.h>#include <GL/glut.h>float time;int Xrotate=0,Yrotate=0,Zmove=0,Xmove=0,Ymove=0,Xprec=0,Yprec=0;static GLfloat sun_col[4]={1,.5,.2,1};static GLfloat moon_col[4]={1,1,1,1};static GLfloat p_col[4]={.2,.2,1,1};void init(void){ glEnable(GL_DEPTH_TEST); static GLfloat lightpos0[4]={0.0,3.0,3.0,0.0}; static GLfloat lightpos1[4]={0.0,-3.0,3.0,0.0}; static GLfloat lightamb1[4]={0.2,0.2,0.2,0.0}; static GLfloat lightdif1[4]={1.0,1.0,1.0,1.0}; static GLfloat lightape1[4]={1.0,1.0,1.0,1.0}; glLightfv(GL_LIGHT0,GL_POSITION,lightpos0); glLightfv(GL_LIGHT1,GL_POSITION,lightpos1); glLightfv(GL_LIGHT1,GL_AMBIENT,lightamb1); glLightfv(GL_LIGHT1,GL_DIFFUSE,lightdif1); glLightfv(GL_LIGHT1,GL_SPECULAR,lightape1); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);}GLdouble get_secs(){ return glutGet(GLUT_ELAPSED_TIME)/500.0;}void display(void){time=(GLfloat) get_secs();glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity(); /*camera position and rotating*/glTranslatef(Xmove,Ymove-1.0,Zmove-12.0);glRotatef(Yrotate+10,1,0,0);glRotatef(Xrotate+60,0,1,0); /* draw sun */glTranslatef (10.0, 0.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,sun_col);glutSolidSphere(1.2, 50, 50); GLfloat lightpos1[4]={10.0,0.0,0.0,0.0};glLightfv(GL_LIGHT1,GL_POSITION,lightpos1);glEnable(GL_LIGHT1); /* draw the planets and their moons */glPushMatrix();/* planet */glRotatef (time*9+100, 0.0, 1.0, 0.0); glTranslatef (5.0, 0.0, 0.0);glRotatef (time*500, 0.0, 1.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,p_col);glutSolidSphere(0.35, 50, 50);glRotatef (time*250, 0.0, 1.0, 0.0);/*moon*/glTranslatef (0.45, 0.0, 0.0);glRotatef (time*200, 1.0, 1.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,moon_col);glutSolidSphere(0.05,50, 50); glPopMatrix();glutSwapBuffers();}void keyboard (unsigned char key, int x, int y){switch (key) { case 27:exit(1);break;}}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 100.0);gluLookAt(0,0,4,0,0,0,0,1,0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void motion(int x,int y){ Xrotate-=(x-Xprec)/2;Yrotate-=(y-Yprec)/2; Xprec=x;Yprec=y;}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 50);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutIdleFunc(display);glutReshapeFunc(reshape);glutMotionFunc(motion);glutKeyboardFunc(keyboard);//glutFullScreen();glutMainLoop();return 0;}
-
[ تمت الإجابة ]كود لرسم دوران الارض حول الشمس OpenGL
khatibe_30 رد على The.Eagle's موضوع في الأسئلة المجابة
السلام عليكم جرب هذا الكود: #include <stdlib.h>#include <GL/glut.h>float time;int Xrotate=0,Yrotate=0,Zmove=0,Xmove=0,Ymove=0,Xprec=0,Yprec=0;static GLfloat sun_col[4]={1,.5,.2,1};static GLfloat moon_col[4]={1,1,1,1};static GLfloat p_col[4]={.2,.2,1,1};void init(void){ glEnable(GL_DEPTH_TEST); static GLfloat lightpos0[4]={0.0,3.0,3.0,0.0}; static GLfloat lightpos1[4]={0.0,-3.0,3.0,0.0}; static GLfloat lightamb1[4]={0.2,0.2,0.2,0.0}; static GLfloat lightdif1[4]={1.0,1.0,1.0,1.0}; static GLfloat lightape1[4]={1.0,1.0,1.0,1.0}; glLightfv(GL_LIGHT0,GL_POSITION,lightpos0); glLightfv(GL_LIGHT1,GL_POSITION,lightpos1); glLightfv(GL_LIGHT1,GL_AMBIENT,lightamb1); glLightfv(GL_LIGHT1,GL_DIFFUSE,lightdif1); glLightfv(GL_LIGHT1,GL_SPECULAR,lightape1); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);}GLdouble get_secs(){ return glutGet(GLUT_ELAPSED_TIME)/500.0;}void display(void){time=(GLfloat) get_secs();glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity(); /*camera position and rotating*/glTranslatef(Xmove,Ymove-1.0,Zmove-12.0);glRotatef(Yrotate+10,1,0,0);glRotatef(Xrotate+60,0,1,0); /* draw sun */glTranslatef (10.0, 0.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,sun_col);glutSolidSphere(1.2, 50, 50); GLfloat lightpos1[4]={10.0,0.0,0.0,0.0};glLightfv(GL_LIGHT1,GL_POSITION,lightpos1);glEnable(GL_LIGHT1); /* draw the planets and their moons */glPushMatrix();/* planet */glRotatef (time*9+100, 0.0, 1.0, 0.0); glTranslatef (5.0, 0.0, 0.0);glRotatef (time*500, 0.0, 1.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,p_col);glutSolidSphere(0.35, 50, 50);glRotatef (time*250, 0.0, 1.0, 0.0);/*moon*/glTranslatef (0.45, 0.0, 0.0);glRotatef (time*200, 1.0, 1.0, 0.0);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,moon_col);glutSolidSphere(0.05,50, 50); glPopMatrix();glutSwapBuffers();}void keyboard (unsigned char key, int x, int y){switch (key) { case 27:exit(1);break;}}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 100.0);gluLookAt(0,0,4,0,0,0,0,1,0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void motion(int x,int y){ Xrotate-=(x-Xprec)/2;Yrotate-=(y-Yprec)/2; Xprec=x;Yprec=y;}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 50);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutIdleFunc(display);glutReshapeFunc(reshape);glutMotionFunc(motion);glutKeyboardFunc(keyboard);glutFullScreen();glutMainLoop();return 0;} -
السلام عليكم أعزائي, مرحبا بكم أقدم لكم مسألة حسابية (مشكلة) و المطلوب إيجاد الحل البرمجي لها. المعطيات: نفترض أنه لدينا 3 أنابيب بسعة متساوية, سعة كل أنبوب 6 لتر, و وعاءين (2 وعاء) نستخدمهما لنملأ الأنابيب بالماء, في كل مرة نسكب الماء في أنبوب ما من الأنابيب (الترتيب غير مهم) باستخدام أحد الأوعية إلى أن نملأ كل الأنابيب. الوعاء الأول سعته 3 لترات, و الوعاء الثاني سعته 2 لترات. الشرط الوحيد الذي يجب أن نتقيد به هو أن لا نجد مستوى الماء متساوي في أنبوبين متجاورين أثناء أي مرحلة من العملية, مثلا أنظر إلى الصورة: العملية على اليسار صحيحة, لأنه لا يوجد أنبوبين متجاورين لهما نفس المستوى من الماء العملية على اليمين, غير مسموح القيام بها, الأنبوب الثاني و الثالث لهما نفس المستوى, لذلك يجب أن نتوقف. إذن, يجب أن نملأ الأنابيب, نسكب كمية من الماء باستعمال أحد الأوعية في كل أنبوب إلى أن نملأه باستخدام مجموعة من الأوعية, على شرط عدم وصول الماء لنفس المستوى في أنبوبين متجاورين, في المثال السابق, من أجل 3 أنابيب, سعة كل أنبوب 6 لترات, يوجد طريقتين لملأ الأنابيب كما في الصورة: الطريقة الأولى, على اليسار: الأنبوب الأول 3-3, الأنبوب الثاني 2-2-2, الأنبوب الثالث 3-3 الطريقة الثانية, على اليمين: الأنبوب الأول 2-2-2, الأنبوب الثاني 3-3, الأنبوب الثالث 2-2-2 و من أجل 3 أنابيب, سعة كل أنبوب 8 لترات, يوجد 4 طرق, و هذه إحدى الطرق في الصورة: 2-3-3, 3-3-2, 2-3-3 في حين أن العملية التالية خاطئة: 3-3-2, 2-2-2-2, 3-2-3 خلال العملية, نلاحظ أن الأنبوب الثاني و الثالث يمكن أن يكون الماء فيهما في نفس المستوى باستعمال سلسلة الأوعية المعطاة لكل أنبوب. المطلوب: أوجد عدد الطرق التي يمكن أن نملأ بها 10 أنابيب, سعة كل أنبوب 32 لتر, يمكنك أن تستعمل أي لغة برمجة تريد في كتابة الكود الذي سيقوم بالحساب. أي, من أجل N = 10 و L = 32 كم يوجد من عدد الطرق ملأ الأنابيب؟ الأفضل أن تكتب الكود الذي سيعمل في الحالة العامة, من أجل عدد أنابيب N, كل أنبوب بسعة L لترات, أوجد عدد الطرق التي يمكن أن نملأ بها الأنابيب. معطيات مساعدة: إليك هذه النتائج المحسوبة مسبقا: من أجل N = 3 و L = 8 هناك 4 طرق من أجل N = 3 و L = 9 هناك 8 طرق من أجل N = 5 و L = 10 هناك 28 طريقة من أجل N = 6 و L = 13 هناك 452 طريقة من أجل N = 5 و L = 16 هناك 1796 طريقة ملاحظة: قبل أن أكتب الموضوع أجريت بحثا في المنتدى حتى أتجنب التكرارا و لم أجد موضوعا مشابه, لذلك, إذا كان الموضوع مكررا فأرجو حذفه و إبلاغي.
- 41 ردود
-
1
-
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
linuxman الكود الذي كتبته أنت ينقصه شيء واحد حتى يتم تنفيذه في وقت معقول, و هو تخزين النتائج تلاحظ أنه يوجد الكثير الكثير من الحسابات التي تتكرر مثلا إذا وصلت ألى الأنبوب رقم 2, و كانت الطريقة الحالية لملء الأنبوب هي رقم r من الطرق 3329, طبعا ستحسب الطرق التي توافقها في الأنبوب 3 و الطرق التي توافق الطرق التي توافقها في الانبوب 4...الخ الى ان تصل الى الانبوب 10 لذلك, يجب أن تقوم بتخزين هذه النتائج في مصفوفة مثلا m(2, r) = result; و عندما تعود إلى الحلقة الأولى و تبدأ عملية التحقق من الأنبوب الثاني, فإنك قبل أن تدخل في حلقة أخرى, ستتحقق هل تم حساب هذه النتيجة التي ستقوم بحسابها مسبقا او لا اذا سبق و حسبتها, استعمل النتيجة المخزنة و اخرج من الحلقة و انتقل الى الحالة الموالية و هكذا -
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
أظن أن الأخ مصطفى غائب, هذا حل مصطفى: #include<cstdio> int num(int a) { if(a==1) return 0; else if(a==2) return 1; else if(a==3) return 1; else return num(a-2)+num(a-3); } int number=0; class tree { private: int value; int ID; tree*prev; tree*next1; tree*next2; public: tree(int); tree(int,tree*); int treesize(int); int getleaf(int,int); }; tree **b; tree:: tree(int a) { value=a; next1=new tree(value-2,this); next2=new tree(value-3,this); } tree:: tree(int a,tree*b) { value=a;prev=b; if(a==1) value=0; else if(a!=2&&a!=3) { next1=new tree(value-2,this); next2=new tree(value-3,this); } else if(a==2||a==3) { ID=number++; ::b[ID]=this; } } int tree::treesize(int end) { tree *buffer=this; int i; for(i=0;buffer->value!=end;i++) buffer=buffer->prev; return i; } int tree::getleaf(int end,int j) { tree *buffer=this; int i; for(i=0;buffer->value!=end;i++) { if(i==j)return buffer->value; buffer=buffer->prev; } return 0; } typedef char Byte; bool linearsearch(int *a,int size,int target) { for(int i=0;i<size;i++) if(a[i]==target)return 1; return 0; } int **series; int *counterSeries; void initseries(int L) { series=new int*[num(L)]; counterSeries=new int[num(L)]; } void wich_next(int**c,int L) { initseries(L); int Size=num(L); int counter=Size,counter2=Size; int i,j,k; int indeX=0; for(i=0;i<num(L);i++) { series[i]=new int[Size]; counter=Size,counter2=Size; for(j=0;j<Size;j++)series[i][j]=j; for(j=0;j<b[i]->treesize(L);j++) { for(k=0;k<counter2;k++) { if( linearsearch (c[series[i][k]], b[series[i][k]]->treesize(L), c[i][j])) {series[i][k]=-1;counter--;} } int *buffer=new int[counter]; int index=0; for(k=0;k<counter2;k++) if(series[i][k]!=-1) buffer[index++]=series[i][k]; series[i]=buffer; counter2=counter; }counterSeries[indeX++]=counter; } } main() { unsigned int L; unsigned int N; printf("Enter L :");scanf("%u",&L); printf("Enter N :");scanf("%u",&N); b=new tree*[num(L)]; tree a(L); int i,j,k; int**c=new int*[num(L)]; for(i=0;i<num(L);i++) { int X=b[i]->treesize(L); c[i]=new int[X]; for(int j=0;j<X;j++) c[i][j]=b[i]->getleaf(L,j); } wich_next(c,L); long long **array; array=new long long*[N]; array[0]=new long long[num(L)]; for(j=0;j<num(L);j++)array[0][j]=1; for(i=1;i<N;i++) { array[i]=new long long[num(L)]; for(k=0;k<num(L);k++)array[i][k]=0; for(j=0;j<num(L);j++) { for(k=0;k<counterSeries[j];k++) array[i][series[j][k]]+=array[i-1][j]; } } long long int SUPERSUM=0; SUPERSUM=0; for(i=0;i<num(L);i++)SUPERSUM+=array[N-1][i]; printf("%llu\n",SUPERSUM); return 0; } -
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
أجل, تهانينا, الحل صحيح :happy: :happy: أعتقد أن حلك = حل linuxman + إضافة مميزة (و هي مفتاح اللغز) -
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
هذا الكود, نظريا صحيح و سيعطي نتيجة, و لكن عمليا, لا يمكن أن يعطيك نتيجة إذا كانت نتيجة أنبوبين و هي -حسب طريقتك- عبارة عن 33292عملية تحقق من توافق الأنابيب تأخذ معك 1 ثانية فقط و ليس 20 فإن التحقق من 10 أنابيب و الذي سيكون -حسب طريقتك- عبارة عن 332910عملية تحقق أي سيكون 33292 * 33298 عملية تحقق من توافق الانابيب و سيأخذ من الوقت 1*33298 ثانية و هذا أكثر من 478303715279 مليار سنة حسب حساباتي حتى باستعمال سوبر سوبر سوبر كومبيوتر فسيأخذ هذا الكود حتى يجد حلا عشرات أو مئات ملايين السنين و ربما أكثر بكثير -
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
مادامت البداية صحيحة فالباقي سيكون صحيح, و لكن وقت التنفيذ عامل مهم جدا, أكواد bruite force يمكن أن تأخذ عشرات السنين حتى تصل الى نتيجة في الحالات الكبيرة لذلك, اذا كانت طريقتك بعد تعميمها على 10 أنابيب على الأقل تجد النتيجة في أقل من ثانية فهي طريقة مقبولة. -
لغز برمجي, التحدي مفتوح بأي لغة برمجة
khatibe_30 رد على khatibe_30's موضوع في الرياضيات والخوارزميات
خذ وقتك و على راحتك يا مصطفى, على ما أذكر أنا فتحت هذه المسألة عندما وجدتها باستخدام bruit force و بمسح كل الاحتمالات و النتيجة في جزء من الثانية, ربما تستطيع أن تجد لنا صيغة رياضية أفضل. -
هذه الصيغة التي وصلت اليها: #include<stdio.h> #include<stdlib.h> int main(){ unsigned long long n; printf("n = "); scanf("%llu", &n); if(n%2) printf("0\n"); else{ unsigned long long p, diff, bCells = 2*n*n+n-1; if(n==2) diff = 1; else diff = (n/2)*(n/2)-1; bCells -= diff; printf(" f(n) = "); printf("%llu\n", bCells*4+1); } system("pause"); return 0; } أقوم بحساب اجمالي عدد الخانات السوداء التي تقع ضمن المساحة التي يتجول عليها الحصان على ربع لوحة شطرنج, ثم انقص منه الخانات السوداء التي لا يستطيع الوصول اليها من تلك المجموعة و اطرح ايضا عدد الخانات لسوداء التي يصل اليها على الخط الأفقي أو العمودي, حتى أتحصل على ربع عدد خانات كل لوح الشطرنج بالضبط, اضاعف 4 مرات و اضيف واحد. ليست صيغة مثالية و لكنها تفي بالغرض ^_^
- 22 ردود
-
1
-
هذه أفضل من الطريقة التي استخدمتها أنا هلا تكرمت و شرحت لي كيف وصلت اليها
-
أجل حصلت على طريقة حسابية و تبين انها شغااالة :lol: :lol: :lol:
-
مصطفى من ضمن ما أكره من الألغاز أكره الألغاز المتعلقة بلوحة الشطرنج خصوصا و ألغاز الصيغ الرياضية عموما لست جيدا في مشاكل الـ combinations و n-chooses-k ما شابه و أستعمل bruit force دائما في حل هذه المشاكل المهم, قمت بحساب النتيجة في ربع لوحة شطرنج ثم أضاعفها 4 مرات و اضيف 1 الخاص بنقطة البداية تحقق لي من هذه النتائج, أتحصل عليها في جزء من الثانية و لست متأكد من صحتها n(100) = 70401 n(2000) = 28008001 n(216) = 30065033217 n(224) = 1970324904083457
- 22 ردود
-
2
-
سؤال/ بالنسبة لطريقتك, هل تعتمد على صيغة رياضية محددة أم أنك تلعب كل الاحتمالات و تحسب؟
-
أنا لم أعتمد على اي صيغة رياضية, فقط لعب كل الاحتمالات و استخدام البرمجة الديناميكة في اللعب حسنته قليلا و أعطاني النتيجة n(30) = 6421 سأحاول أن أجد كود أفضل من هذا لاحقا...سلام مؤقت
-
اذا, الكود الذي كتبته مبدئيا صحيح, n(8) = 481 و لكنه بطيء و لم يستطع ايجاد n(16) :lol: :lol: على العموم سأحاول تحسينه
-
n=15 النتيجة 0 هل من أجل n=6 النتيجة 277 ؟؟؟