الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه أحمد أبو عبد البر في 4 أكتوبر 2013 · 6 رد · 1,664 مشاهدة · في المسابقات البرمجية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

 

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

 

 

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

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

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

 

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

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

الكوكب الأول :  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

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 4 أكتوبر 2013 في 16:58

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#2

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

هذا هو الكود 

//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,x,i==7?'\n':',');*/                for(int i=1;i<8;i++)        {            if(                ( y%x==0 && y[i-1]%x[i-1]==0 )                &&                ( ( y / x ) == ( 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%x==0)                    if(y/x==6)//2*PI                        y=0;                y++;            }            D++;        }    }    printf("days before next queueing %d\n",D);    return 0;}

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

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

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

 

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

3
#3

السلام عليكم

الحل

//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 = calcTime(i,speed[0],speed[1],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 = calcAngle(cycleTime,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 != angles[0])		return false;return true;}
#4

سلام وعليكم هذا حلي ب 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 = 0;//all equal zero and then start from 1 in while loop                StartDaysOneYear = ((i + 1) * pi * 50000000 )/ StartSpeed;//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++;                    if (StartDaysAccount == StartDaysOneYear + 1)                    {                        StartDaysAccount = 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)==(StartDaysOneYear[i+1]/StartDaysOneYear))//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 ....                }            }        }    }}
#5

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

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

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

Public Class Form1
    Dim r = 3
Private 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 = result
End 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 في 5 أكتوبر 2013 في 12:31

Samir Ibrahim

VFP Blog

VB.NET Blog

#6

بلغة الـ 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 في 5 أكتوبر 2013 في 13:47

#7

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

}

[سبحان الله و بحمده, سبحان الله العظيم]

مواضيع مشابهة