• 0
أحمد أبو عبد البر

نتيجة السؤال الرابع من مسابقة الفريق العربي للبرمجة -4

سؤال

سلام عليكم

 

كان السؤال الرابع هو

 

 

تدور ثمانية كواكب حول أحد النجوم في مجرة درب التبان

السؤال هو : بعد كم يوم سوف تصطف في خط واحد  حيث يحجب بعضها على بعض ضوء النجم مثل ما يحدث في الكسوف عندنا 

وذلك باحتساب الأيام من آخر اصطفاف حدث

 

تؤخذ  المعطيات التالية :

سرعة دوران الكواكب :   

الكوكب الأول :  5000000/3 كلم/يوم

الكوكب الثاني : 10000000/4 كلم/يوم

الكوكب الثالث : 15000000/6 كلم/يوم

الكوكب الرابع : 20000000/7 كلم/يوم

الكوكب الخامس : 25000000/8 كلم/يوم

الكوكب السادس : 10000000/3 كلم/يوم

الكوكب السابع : 35000000/11 كلم/يوم

الكوكب الثامن 40000000/12 كلم/يوم

 

 

يبعد الكوكب الأول عن مركز النجم مسافة 50000000 كم

ويبعد كل كوكب عن جاره مسافة 50000000 كم

 

مسارات هذه الكواكب دائرية

 

نأخذ العدد pi =3

 

يكون الناتج عددا صحيحا

 
 
والنتيجة هي  332640
 
 
 
وقد تمكن الأعضاء التالون من الإجابة وتحصل كل منهم على 300 نقطة
 
 

مصطفى 36a2

 

abdou001

 

khatibe_30

 

zaraki_kenpache

 

SharpSword

 

samir ibrahim

 

 

 

مفتاح الحل هو أن تعرف أن الكواكب لا تصطف إلا إذا كان جداء السرعة الزاوية و الزمن يقبل القسمة على 2*pi أي 6

تم تعديل بواسطه أحمد أبو عبد البر
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

الحمد لله :)
بارك الله فيكم أخي أحمد ...

هذا هو الكود 

//answer is 332640 which is LCM(30,40,60,70,80,90,110,120)*2*PI//LCM : least common multiple :)#include<cstdio>int main(){    int x[8]={30,40,60,70,80,90,110,120};    int y[8]={1,1,1,1,1,1,1,1};//first day encountered.    int D=1;    while(true)    {        bool s=1;/*        printf("%d\t",D);        for(int i=0;i<8;i++)            printf("\t%d/%d %c",y[i],x[i],i==7?'\n':',');*/                for(int i=1;i<8;i++)        {            if(                ( y[i]%x[i]==0 && y[i-1]%x[i-1]==0 )                &&                ( ( y[i] / x[i] ) == ( y[i-1] / x[i-1] ) )                )                s&=1;            else                s=0;        }        if(s==1)            break;        else        {            for(int i=0;i<8;i++)            {                if(y[i]%x[i]==0)                    if(y[i]/x[i]==6)//2*PI                        y[i]=0;                y[i]++;            }            D++;        }    }    printf("days before next queueing %d\n",D);    return 0;}

وفكرة الحل قائمة على :

1- ايجاد السرعة الزاوية للكواكب وواحدتها ( راديان في اليوم )
2- زيادة الزاوية كل يوم حسب سرعتها الزاوية .. وعندما يدور دورة كاملة نرجع الزاوية الى صفر

3- عندما تصل كل الزوايا الى صفر معاً يكون تحقق المطلوب

 

والله ولي التوفيق

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

الحل

//332640#include <iostream>using namespace std;typedef long long SLONG;///////////////////////////////////////////////////////////////////SLONG calcTime(SLONG number,SLONG x,SLONG y,SLONG K,SLONG PI);SLONG numberOfDays(SLONG cycleTime[],SLONG planets);SLONG calcAngle(SLONG cycleTime,SLONG day);void updateAngles(SLONG angles[],SLONG cycleTime[],				SLONG planets,SLONG day);bool alignment(SLONG angles[],SLONG planets);////////////////////////////////////////////////////////////////////////////int main(){const SLONG PI = 3;const SLONG planets = 8;const SLONG K = 50000000;SLONG speed[2][planets] = {5000000,10000000,15000000,20000000,25000000,					10000000,35000000,40000000,3,4,6,7,8,3,11,12};					SLONG cycleTime[planets];for(SLONG i=0;i<planets;i++)	cycleTime[i] = calcTime(i,speed[0][i],speed[1][i],K,PI);cout << numberOfDays(cycleTime,planets) << endl;		return 0;}//////////////////////////////////////////////////////////////////SLONG calcTime(SLONG number,SLONG x,SLONG y,SLONG K,SLONG PI){SLONG R = (number+1) * K; SLONG D = R * 2 * PI; return (D * y)/x;}///////////////////////////////////////////////SLONG numberOfDays(SLONG cycleTime[],SLONG planets){SLONG day = 0;SLONG angles [planets]; do{	day++;	updateAngles(angles,cycleTime,planets,day);	}while(!alignment(angles,planets));return day;}///////////////////////////////////////////void updateAngles(SLONG angles[],SLONG cycleTime[],				SLONG planets,SLONG day){for(int i = 0 ;i<planets;i++)	angles[i] = calcAngle(cycleTime[i],day);}////////////////////////////////////////////SLONG calcAngle(SLONG cycleTime,SLONG day){if (day % cycleTime == 0)	return 0;return (day * 360)/cycleTime;}///////////////////////////////////////bool alignment(SLONG angles[],SLONG planets){for(int i=0;i<planets;i++)	if(angles[i] != angles[0])		return false;return true;}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سلام وعليكم هذا حلي ب c#

//c#  result is 166320 //first stright is 166320 , the second stright 166320 *2 =332640, and the three stright 166320 *3 =498960 ...ectusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication4{    class Program    {        static void Main(string[] args)        {            const int pi=3;            float[] StartDaysOneYear = new float[8];            int[] StartSpeed=new int[8];            float[] StartDaysAccount = new float[8];            int[] StartDestans = new int[8];                        StartSpeed[0]=5000000/3;            StartSpeed[1]=10000000/4;            StartSpeed[2]=15000000/6;            StartSpeed[3]=20000000/7;            StartSpeed[4]=25000000/8;            StartSpeed[5]=10000000/3;            StartSpeed[6]=35000000/11;            StartSpeed[7] =40000000 / 12;                        for (int i = 0; i < 8; i++)			{                StartDaysAccount[i] = 0;//all equal zero and then start from 1 in while loop                StartDaysOneYear[i] = ((i + 1) * pi * 50000000 )/ StartSpeed[i];//StartDaysOneYear[0 to 7]=90 , 120 ,180 ,210 ,240,270,330,360            }            int DaysCount = 0;//for result            bool ItsStright=false;//for stop while loop whe all starts in one stright                        while (!ItsStright)            {                DaysCount++;                for (int i = 0; i < 8; i++)                {                    StartDaysAccount[i]++;                    if (StartDaysAccount[i] == StartDaysOneYear[i] + 1)                    {                        StartDaysAccount[i] = 1;//if start one =91  change it to 1 also if start two =121 change it to 1 also to start 8                    }                                    }                int count = 0;                for (int i = 0; i < 7; i++)                {                    if ((StartDaysAccount[i+1]/StartDaysAccount[i])==(StartDaysOneYear[i+1]/StartDaysOneYear[i]))//cheak if this two starts are in the same line                    {                        count++;                                       }                }                if (count == 7)//if =7 all starts in one line                {                    ItsStright = true;                    Console.WriteLine(" result =" + DaysCount.ToString());//print result =166320 for information the next line in 166320*2 and then 166320*3 ....                }            }        }    }}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انا فكرت فيها هكذا

-1 الحصول على عدد ايام كل كوكب للدوران دورة كاملة في مداره (سنة الكوكب)

2- الحصول علي رقم يقبل القسمة على 8 ارقام (سنة الكوكب)

Public Class Form1    Dim r = 3Private Sub btnButton1_Click( sender As Object,  e As EventArgs) Handles btnButton1.Click    Dim ti(8)    ti(0) = 0    Dim vi = {0,5000000/3,10000000/4,15000000/6,20000000/7,25000000/8,10000000/3,35000000/11,40000000/12}        For i = 1 to 8        ti(i) = pi(i)/vi(i) ' planet year (number of days to make full circle)    Next    ' get the LCM for 8 number    Dim result = ti(1)     For i = 2 to 8 - 1        result = LCM(result,ti(i+1))    Next    txt_1.Text = resultEnd Sub    Function pi(i As Integer)        Return 2 * r * 5 * i * 10000000    End Function    Private Function LCM(a As Long, b As Long) As Long        LCM = (a / GCD(a, b)) * b    End Function    Private Function GCD(a As Long, b As Long) As Long        'Conventionally set a>=b        If a < b Then            GCD = GCD(b, a)            Exit Function        End If            If b <> 0 Then            GCD = GCD(b, a Mod b)            Exit Function        End If            GCD = a        Exit Function    End Function
تم تعديل بواسطه samir ibrahim
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بلغة الـ C#

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{    class Program    {        // fonction de trouver PPCM (المضاعف المشترك الأصغر(        public static int determinePPCM(int a, int b)        {            int num1, num2;            if (a > b)            {                num1 = a; num2 = b;            }            else            {                num1 = b; num2 = a;            }            for (int i = 1; i <= num2; i++)            {                if ((num1 * i) % num2 == 0)                {                    return i * num1;                }            }            return num2;        }        static void Main(string[] args)        {            long[,] planet = new long [8,5]; // 1,2:vitesse et diviseur de vitess , 3:rayon , 4:r*2pi , 5: tour                       // initialisation des valeurs            planet[0, 0] = 5000000; planet[0, 1] = 3;            planet[1, 0] = 10000000; planet[1, 1] = 4;            planet[2, 0] = 15000000; planet[2, 1] = 6;            planet[3, 0] = 20000000; planet[3, 1] = 7;            planet[4, 0] = 25000000; planet[4, 1] = 8;            planet[5, 0] = 10000000; planet[5, 1] = 3;            planet[6, 0] = 35000000; planet[6, 1] = 11;            planet[7, 0] = 40000000; planet[7, 1] = 12;            // calculer les rayons            planet[0, 2] = 50000000;            for (int i = 1; i < 8; i++)                planet[i, 2] = planet[i - 1, 2] + 50000000;            // calculer r*2pi (المحيط(            for (int i = 0; i < 8; i++)                planet[i, 3] = 6 * planet[i, 2];            // calculer le tour (jours)            for (int i = 0; i < 8; i++)                planet[i, 4] = (planet[i, 3] * planet[i, 1]) / planet[i, 0];            // resultat final (nb jours pour etre en meme ligne) ppcm des jours (المضاعف المشترك الأصغر(            int PPCM = 1;            for (int i=0 ; i < 8 ; i++)                PPCM = determinePPCM (PPCM , (int)planet[i , 4]);            Console.Write(PPCM);            Console.WriteLine(" Day for be in the same line");             // Exit part                        Console.ReadKey();        }    }}

الفكرة كانت كالتالي :

1- حساب محيط كل مدار من مدارات الكواكب

2- حساب دور كل كوكب (عدد الأيام ليكمل دورة حول النجم)

3- حساب أول عدد يكون مضاعفا لجميع الدورات ، وهو ما يعني أن جميع الكواكب أكملت دورة وعادت لنقطة البداية ، رياضيا المضاعف المشترك الأصغر

تم تعديل بواسطه SharpSword
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

//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");

}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .