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

افتتاح أكبر تجمع لعشاق لغتي السي و السي++ على منتديات الفريق العربي للبرمجة.

مغلقرائج
بدأه Snack3r في 25 يونيو 2010 · 322 رد · 21,470 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#226

السلام عليكم

اقتباس
اولا اعتقد هذا يعتمد على طريقة الحل التى تتبعها، ثانيا انا لم افهم شئ من الموجود فى الإقتباس :blink:

بالنسبة لي فقد قمت بحل السؤال بطريقتين:

الأولى (و هي الأفضل) : لم أخزن الناتج في متغير و هذا مما سمح لي بالتعامل مع الأعداد الكبيرة جدا :wink: و التي تأخذها n.

الثانية : قمت بتخزين الناتج في متغير و هذا ما جعل البرنامج محدود على مجال مجال معين لقيم n بحيث يصلح لتلك الأرقام فقط.

سلامي :)

#227

أرسلت محاولتي لك لحل اللغز بجميع فقراته :)

مجموعة فقرات جميلة وسهلة شكرا لك :)

#228

تم إرسال الأجزاء الثلاثه يا حمزه :D

#229

السلام عليكم

مع نهاية هذا اليوم تنتهي المهلة المحددة لحل اللغز الخامس

اللغز كان سكر خفيف - وحققت ما أريد ، مزيد من المشاركين عن ذي قبل

لكن أظنه الهدوء الذي يسبق العاصفة - ستصدقون ذلك عندما تعلمون من الفائز ، وربما لن يكون كذلك :huh:

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

في المرة القادمة أعدكم بألغاز جميلة لكن

omg76.jpg

خطرت لي اليوم وأنا في المكتبة

دمتم في رعاية الله

البرمجة = الرياضيات

#230

اليوم هو اليوم السادس، فأين النتائج؟

مدونتي: C++ Tips and Tricks

#231

اللغز الخامس في اليوم السادس

لعل هذا اسم مسلسل سيعرض في رمضان القادم ، لا أحد يدري :lol:

قام الفائز بحل جميع الأسئلة حلاً صحيحاً مليحاً وفي وقت قباسي

لذا نقول : ألف مبروك للفائز

وحسب شروط المسابقة سيقوم الفائز بعرض لغزه الجديد ليلة الغد ( الخميس )

فعلى بركة الله نكمل المشوار . .

البرمجة = الرياضيات

#232

أعتقد أن الفائز لا أحد يعرفه سوى الأخ حمزه و هو نفسه... لذا نتطلع شوقا لمعرفته :D

#233

مبارك للأستاذ " محمد علاء الدين "

دون مقدمات هذه المرة ، حلوله رائعة ومبدعة :

الحل في المرفقات ، إذا أردت رؤية حل أي من الفروع ، انسخ الكود بداخل الملفات إما first.cpp أو second.cpp أو third.cpp بدل الكود الذي تراه أمامك في solution.cpp لترى وتنفذ أي واحد من الفروع الثلاثة وتفحص النتائج ...

إلى أن يضع الأستاذ لغزه الجديد مساء غد بإذن الله ، سأقوم بعرض باقي الحلول ، لكني الآن مشغول بمشروعين ، حتى صباح الغد ، واحد منهم يجب تسليمه قبل منتصف الليلة ، يبدو الليلة ما في نوم ، ادعولي . . .

دمتم سالمين

5th.rar

البرمجة = الرياضيات

#234

الحمد لله أول فوز (و يارب لا يكون الأخير).

بالنسبه للغز القادم يوجد لدى فكرتين و كلاهما سيجعلوا شعرك يقف من التفكير لذا سأضع اسهلهما غدا و ذلك حتى اجهز الدوال التى قد يتم الإحتياج لها.

لذا استعدوا.

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

مدونتي: C++ Tips and Tricks

#235

ألف مبروك لأستاذنا محمد علاء الدين

مبروووووووك :D

اقتباس
بالنسبه للغز القادم يوجد لدى فكرتين و كلاهما سيجعلوا شعرك يقف من التفكير لذا سأضع اسهلهما غدا و ذلك حتى اجهز الدوال التى قد يتم الإحتياج لها.

أستر يا رب :D

ننتظر سؤالك على أحر من الجمر :D

#236
اقتباس
لكن أظنه الهدوء الذي يسبق العاصفة - ستصدقون ذلك عندما تعلمون من الفائز

صدقتم ؟

أعطينا أفضل ما عندك

لكن بدون توقيف شعر الراس إذا سمحت

البرمجة = الرياضيات

#237
اقتباس

أعطينا أفضل ما عندك

لكن بدون توقيف شعر الراس إذا سمحت

هذا أمر عائد لشعرك :lol:

مدونتي: C++ Tips and Tricks

#238

السلام عليكم

يا شباب خلوا بالكم من الشعر بتاعكم :P

أرى أن البعض سيصاب بالصلع من شدة التفكير :lol:

بالنسبة لي فلن يقف شعري لأنني لن أشارك في هذا الإختبار :lol:

بالتوفيق :)

#239

مبروك للأستاذ محمد علاء الدين

آمل أن تعطينا الوقت حتى نثيت شعورنا قبل البداية "مشغول هذه الأيام"

#240

سأقوم بوضع اللغز بعد أن يقوم الأخ حمزه بوضع باقى الحلول.

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

مدونتي: C++ Tips and Tricks

#241

الأخ خالد khaled_prg كان أول من أرسل لي حل الفرع الأول من اللغز

الحل التالي فقط حتى 4000

#include<iostream>
using namespace std;

int main()
{
    int n=0;

    for(int i=0;i<4000;i++)
    {
       if(i>=0 && i<=10)
        if(i%10==3) n++;
       if(i>=10 && i<=100)
        if(i%10==3 && ((i-i%10)/10)==3) n++;
       if(i>100 && i<=1000)
        if(i%10==3 && ((i-i%100)/100)==3) n++;
       if(i>=1000 && i<=4000)
        if(i%10==3 && ((i-i%1000)/1000)==3) n++;
    }

    cout<<n<<endl;
    system("pause");
    return 0;
}

ثم الحل التالي لأي n حتى يقول الكمبيوتر بس :lol:

طبعاً ذلك لا يعتمد على تحمل الـ integer للجواب ، لأن الجواب لا يخزن بمتغير بل يطبع مباشرة بالاعتماد على شكله العجيب

111111111111111112

#include<iostream>
using namespace std;
int main()
{
    int n;
    cout<<"n=";
    cin>>n;
    for(int i=1;i<n;i++)
    cout<<1;
    cout<<2<<endl;
    system("pause");
    return 0;
}

ويا فرحة ما تمت :lol: هناك مشكلة عند n = 0 ، الأمر نفسه في الحل الذي أعاد كتابته بناءاً على التفسير الرياضي

#include<iostream>
using namespace std;

int main()
{
    int n,num=2;

    cout<<"n = ";
    cin>>n;

    for(int i=1,j=10; i<n; i++,j*=10)
		num += j;

    cout<<num<<endl;
    system("pause");
    return 0;
}

تفسير الأخ خالد :

اقتباس

سنقوم بتقسيم المجال [0,40000] إلى المجالات التالية:

[0,40000]=[0,10]+[10,100]+[100,1000]+[1000,10000]+[10000,40000]

و سيكون عدد الأرقام (البادئة بـ 3 و المنتهية بها) يساوي عدد الأعداد البادئة و المنتهية بـ 3 في كل مجال على انفراد.

بالنسبة للمجال الأول و الثاني فـيوجد عددان يبدءان و يتنهيات بـ 3 و هما 3 و 33.

بالنسبة للمجال الثالث فستكون الأعداد البادئة و المنتهية بـ 3 تخضع للشكل التالي:3x3

حيث x تتغير من 0 و حتى 9 مما ينتج عن ذلك الأرقام التالية:

303,313,323,333,343,....393

الآن أصبح لدينا 10 احتمالات, أي 10 أعداد تبدأ و تنتهي ب 3 و ذلك في المجال [100,1000].

نفس الشيء بالنسبة لبقية المجالات:

ففي المجال [1000,10000] ستكون الأعداد (التي تبدأ و تنتهي ب 3) تخضع للشكل التالي:3xy3

حيث x تتغير من 0 و حتى 9 و كذلك y , مما يعني وجود 10 احتمالات لـ x و 10 احتمالات لـ y و نحصل على عدد الإحتمالات الكلية من خلال ضرب عدد احتمالات x في عدد احتمالات y ليكون الحاصل 100 احتمال , و بالتالي يوجد 100 عدد يبدأ و ينتهي بـ 3 و ذلك في المجال [1000,10000].

أما في المجال [10000,40000] فستكون الأعداد من الشكل:3xyz3

حيث x تتغير من 0 و حتى 9 و كذلك y و z , ليصبح عدد الإحتمالات في هذا المجال يساوي 1000 (أي 10*10*10).

عدد الأعداد الكلي يساوي عدد الأعداد الناتجة عن كل مجال على انفراد ,اي أن:

عدد الأعداد التي تبدأ و تنهي ب 3 في المجال الكلي هي:

1+1+10+100+1000=1112

ذلك التفسير أورده أيضاً الأخ محمد علاء الدين وحل على أساسه - انتبه جيداً ، الكود يعمل حتى عند n = 0

#include <iostream>
#include "helper.h"
using namespace std;

// FIRST

int main()
{
	// max number to check
	uint64 ten_to_power = 0;
	// count of numbers
	uint64 count = 0;

	// get then nth power of 10
	do 
	{
		cout << "Enter n power of 10 to stop at (0...10): ";
		cin  >> ten_to_power;
		cout << '\n';
	}
	while (!(ten_to_power >= 0 && ten_to_power <= 10));

	// one or two digits numbers is a special case
	if (ten_to_power < 2)
	{
		cout << "match founded is: " << ten_to_power+1 << endl;
		return 0;
	}

	/*************************************************
	 * the algorithm i will use is to simple and it is
	 *
	 * let us assume the number we try to match is 3
	 *
	 * if number is 3 digits then it will look like 3x3
	 * and the x will be from 0 to 9 = 10 digit and it is
	 * the number of times 3x3 will exist.
	 *
	 * if number is 4 digits then it will look like 3xx3
	 * and the xx will be from 0 to 99 = 100 digit and it is
	 * the number of times 3xx3 will exist.
	 *************************************************/

	// make count equal one
	// now count represents:
	//     count of times number appeared in range 0-10 which is 1
	//     count of times number appeared in range 10-100 which is 1
	count+=2;

	for (int i=0; i<=ten_to_power-2; i++)
		count += pow10<uint64>(i+1);

	cout << "match founded is: " << count << endl;

	system("pause");

	return 0;
}

الزميل هويدي بعث لي أجزاء اللغز بالتقسيط المريح :lol: ، الحل التالي يطبع الأعداد المطلوبة ، والحل صحيح مية المية ، لكن ليس بناءاً على التفسير الرياضي السابق ذكره ، لكن به ميزة أنه إذا تغير الـ range فهو يعمل تمام ، أما الكودات السابقة فلا ، أي أنه حل بالطريقة العامة ، الطرق السابقة استفادت من كون البداية تكون دائماً من 0 لذا اعتمدت الطريقة السريعة في الحل بناءاً على شروط السؤال :

#include <stdio.h>
#include <math.h>

int starts_with_3(int);
int ends_with_3(int);

int main (int argc, char *argv[])
{

        int n;
        printf("Enter n: " );
        scanf("%i", &n);
        const double top = 4 * pow(10, n);
        double i;

        for (i=0; i< top; i++)
                if ( starts_with_3(i) && ends_with_3(i))
                        printf("%.f\n", i);
        return 0;
}

int starts_with_3(int n)
{
        return (n%10==3);
}

int ends_with_3(int n)
{
        int r=0;

        do{
                r = n%10;
        }while ((n = n/10) > 0);

        return (r==3);
}

طريقة زميلنا أبو دحيم مميزة ، في الحقيقة تشبه كود الزميل هويدي لكنه حسب last_digit ( اليسرى ) بشكل أسرع ، اقتران اللوغاريتم يرجع عدد الخانات - 1 ( الصحيح منه ) ، مثلاُ العذذ 458 حتى نحصل على 4 نقسمه على 100 ( فكرة جميلة )

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
        unsigned short int first_digit,last_digit;
        int n,counter=0;
        cin>>n;
        for(int i=1;i<4*pow(10,n);i++)
        {
                first_digit=i%10;
                last_digit=i/pow(10,static_cast<int>(log10(i)));
                if(first_digit==3 && last_digit==3)
                {
                        counter++;
                        cout<<i<<endl;
                }
        }
        cout<<"Total= "<<counter<<endl;
        return 0;
}

الزميل TheBigBiss قدم حلاً رائعاً ، تعامل مع العدد على أنه string وقارن الخانة الأولى بالأخيرة ببساطة ، كما أنه استخدم vector لتخزين الأعداد المطلوبة :

#include <iostream>
#include <vector>
#include <math.h>
#include <sstream>
using namespace std;

int main()
{
    int min = 3;

    long double n;

    vector <int> result;

    cout<<"Enter The Value of 'n' : ";
    cin>>n;

    long double fact = pow(10,n);

    cout<<fact<<endl;

    long double max = 4*fact;

    for(int i = min ; i < max ; i+=10)
    {
            stringstream ss;
            string num;
            ss << i ;
            ss >> num ;

            if(num[0] == '3' && num[num.size()-1] == '3')
                      result.push_back(i);
            }
    for( i = 0 ; i < result.size() ; i++)
            cout<<result<<"\n";

	cout<<"Total = : "<<result.size()<<endl;

    system("pause");   
}

تم تعديل هذه المشاركة بواسطة namespace في 30 يوليو 2010 في 00:38

البرمجة = الرياضيات

#242
اقتباس
طريقة زميلنا أبو دحيم مميزة ، في الحقيقة تشبه كود الزميل هويدي لكنه حسب last_digit ( اليسرى ) بشكل أسرع ، اقتران اللوغاريتم يرجع عدد الخانات - 1 ( الصحيح منه ) ، مثلاُ العذذ 458 حتى نحصل على 4 نقسمه على 100 .

فكره رائعه بصراحة...

#243

نأتي للجزء الثاني من اللغز :

في البداية الزميل محمد علاء الدين قام بالتعامل مع الأرقام على أنها strings ، ثم دوران متداخل كما سنرى في حل الزميل TheBigBiss لكن ما يجعله أفضل هو تحويله إلى strings بينما الزميل TheBigBiss خزن خانات العدد في مصفوفة ..

#include <iostream>
#include <stdio.h>
#include "helper.h"
using namespace std;

// SECOND

int main()
{
	// first number
	uint32 first  = 0;
	// second number
	uint32 second = 0;

	cout << "Enter 1st number: ";
	cin >> first;

	cout << "\nEnter 2nd number: ";
	cin >> second;

	cout << '\n';

	// arrays to hold string representation of input numbers
	char* num1_str = new char[10]; // uint32 can hold only 10 digits
	char* num2_str = new char[10]; // uint32 can hold only 10 digits

	// convert input numbers to string
	int num1_cnt = sprintf(num1_str,"%i", first);
	int num2_cnt = sprintf(num2_str,"%i", second);

	// number of matches founded
	int num_of_match = 0;

	cout << "digits matched: ";

	// loop to get a match
	for (int i=0; i<num1_cnt; i++)
		for (int w=0; w<num2_cnt; w++)
			// if digits matches
			if (num1_str == num2_str[w])
			{
				// make this character space to not
				// match it in next loop
				num2_str[w] = ' ';
				// print that character
				cout << num1_str;
				num_of_match++;
				// do not continue this loop
				break;
			}

	// if no match found
	if (num_of_match == 0)
		cout << "none.";

	cout << '\n';

	system("pause");

	return 0;
}

حل الزميل هويدي للجزء الثاني مشابه لحلي ، يحسب تردد الخانة في العدد ( عدد مرات الظهور ) ، ثم ؛ إذا تكررت الخانة x في عدد 3 مرات وفي العدد الثاني 4 مرات يطبعه 3 مرات ( الأقل ) ، كما يلي :

#include <stdio.h>
#include <stdlib.h>

#define ARR_SIZE 10

void to_array(int, int*);

int main (int argc, char *argv[])
{
	int i;
	int n1 = 22946575;
	int n2 = 630244155;

	int arr1[ARR_SIZE] = {0};
	int arr2[ARR_SIZE] = {0};
	int ret[ARR_SIZE] = {0};

	to_array(n1, arr1);
	to_array(n2, arr2);

	for (i=0; i<ARR_SIZE;i++)
	{
		int min_occurence = arr1;
		if (arr2 < min_occurence)
			min_occurence = arr2;
		ret = min_occurence;
	}

	for (i=0; i<ARR_SIZE;i++)
	{
		int tmp = ret;
		while (tmp-- > 0)
			printf("%i", i);
	}

	printf("\n");

	return 0;
}

void to_array(int n, int* arr)
{
	do{
		arr[n%10]++;
	}while ( (n=n/10) > 0);
}

الزميل أبو دحيم يواصل التألق ويضحك علينا ويستخدم طريقة أفضل بكثير من التي استخدمناها أنا وهويدي :

#include<iostream>
using namespace std;

int main()
{
        int first_number,second_number,temp;

        cout<<"Enter the first number: ";
        cin>>first_number;

        cout<<"Enter the second number: ";
        cin>>second_number;

        int array[10]={0};

        while(first_number)
        {
                array[first_number%10]++;
                first_number/=10;
        }

        while(second_number)
        {
                temp=second_number%10;
                if(array[temp]>0)
                {
                        cout<<temp;
                        array[temp]--;
                }
                second_number/=10;
        }

        cout<<endl;
        return 0;
}

يقول لنا الزميل أبو دحيم : ليش مغلبين حالكم وحاسبين frequency لخانات العدد الثاني ، وكمان حساب min والمرور بـ loop ، أنا طلعت أشطر منكم حسبت frequency للأول ومررت بخانات العدد الثاني مرور الكرام ، ههههه :lol:

الزميل TheBigBiss قام بتخزين الخانات في مصفوفة ، ثم استخدم دوراناً متداخلاً ، وحركة جميلة ؛ أضاف 10 على الخانات عند تشابهها لتلافي تكرار طباعتها في الدور التالي للدوران ، حل جميل لكن مكلف ( الأمر نفسه الذي قام به الزميل محمد علاء الدين لكن الأخير قام بوضع فراغ ' ' مكان الرقم ، يقول لنا : يكفينا التعديل على عدد واحد فقط بوضع فراغ مكان الخانة المعنية ، لكن الزميل TheBigBiss أضاف 10 على كلا الخانتين للعددين ، ماذا نستنتج إذن ؟ هل هناك جملة زائدة في الحل الأخير ؟ بالطبع ؛ الجملة الوسطى في جملة الشرط الأخيرة ، يمكن الاستغناء عنها ) .. :

#include <iostream>
using namespace std ;

int int_size (int n)
{
	int size =0 ;
	while (n>0) {n/=10 ; size ++ ;}
	return size ;
}

int main ()
{
	int num1 , num2 ;
	int *arry1 ,*arry2 ;
	cin>>num1>>num2 ;

	int size1 = int_size(num1) , size2 = int_size(num2) ;

	arry1 = new int[size1] ;
	arry2 = new int[size2] ;

	for (int i=0 ; i<size1 ; i++)
	{
		arry1 = num1%10 ;
		num1/=10 ;
	}

	for ( i=0 ; i<size2 ; i++)
	{
		arry2 = num2%10 ;
		num2/=10 ;
	}

	for ( i=0 ; i<size1 ; i++)
	{
		for (int k=0 ; k<size2 ; k++)
		{
			if (arry1 == arry2[k])
			{
				cout<<arry1;
				arry1 = 10+i ;
				arry2[k] = 10+k ;
			}
		}
	}

	system ("pause") ;

	return 0;
}

تم تعديل هذه المشاركة بواسطة namespace في 30 يوليو 2010 في 01:22

البرمجة = الرياضيات

#244

بالنسبة للجزء الثالث :

حل الزميل هويدي ذلك الجزء بالطريقة المنطقية المباشرة ، انزع خانة في كل مرة وتأكد :

#include <stdio.h>

int is_prime(int);

int main (int argc, char *argv[])
{
	int i = 10000;

	while (i<=99999)
	{
		if (is_prime(i))
		{
			int n = i, count=0;

			while (n>0)
			{
				n = n/10;

				if (!is_prime(n))
				break;
				count++;
			}

			if (count == 4)
			printf("%i\n", i);
		}

		i++;
	}

	return 0;
}

int is_prime(int n)
{
	if(n%2 == 0)
		if(n == 2) return 1;
		else return 0;

	if(n == 1) return 0;

	int limit = n;
	int i = 3;

	while(limit>i)
	{
		if(n%i == 0)
		return 0;

		limit = n/i;
		i += 2;
	}

	return 1;
}

بطريقة مشابهة كتب الزميل أبو دحيم الحل ، لكن ربما أفضل بقليل لأنه لم يستخدم counter في حله :

#include <iostream>
#include <math.h>
using namespace std;

bool isprime(int x)
{
	int i;

	if(x%2==0 && x!=2)
		return (false);

	if(x == 1) return false;

	for(i=3;i<=sqrt(x);i+=2)
		if(x%i==0)
			return (false);

	return (true);
}

void main()
{
	int i,m,c=0;

	for (i=79999;i>=9999;i--)
	{
		if (isprime(i))
		{                       
			m=i;
			while (m!=0)
			{               
				m=m/10;
				if (!isprime(m))
				break;
			}

			if(!m)
			{
				cout<<i<<endl;
				c++;
			}
		}
	}

	cout<<"Total is: "<<c<<" numbers"<<endl;
}

الزميل TheBigBiss ، حل اللغز لكن باستخدام vectors مرة أخرى ، استخدم counter كالزميل هويدي لكن لاحظ أن شرط الدوران while مختلف ، في المقابل استخدم الزميل هويدي break ، استغنى عن ذلك TheBigBiss بسبب اختلاف الشرط . .

#include <iostream>
#include <vector>
using namespace std;

bool isPrime(int n) 
{ 
    if(n%2 == 0) 
        if(n == 2) return true; 
        else return false; 

    if(n == 1) return false; 

    int limit = n; 
    int i = 3; 

    while(limit>i) 
    { 
        if(n%i == 0) 
            return false; 

        limit = n/i; 
        i += 2; 
    } 

    return true;  
}

int main()
{
	int min = 10000 , max = 100000 ;
	vector <int> prime_n;

	for(int i = min ; i < max ; i++)
	{
		int counter = 0;
		int temp = i;
		while(isPrime(temp))
		{
			temp/=10;   
			counter++;
		} 

		if(counter == 5)
			prime_n.push_back(i);
	}

	for( i = 0 ; i < prime_n.size() ; i++)
		cout<<prime_n<<"\n";

	system("pause");   
}

حل الزميل محمد علاء الدين اعتماداً على الفكرة ذاتها لكن بطريقة مختلفة قليلاً وباستخدام اقتران أسرع لمعرفة العدد أولي أم لا ، هذا هو الجزء الأبرز من الحل :

bool isPrimeSeries(char* str)
{
	uint32 num = ctoi(str, 0, 4);

	for(int i=3; i>=0; i--)
	{
		if (isPrime(num))
			num = ctoi(str, 0, i);
		else
			return false;
	}

	return true;
}

int main()
{
	ifstream in("primes");

	if(!in)
	{
		cout << "Cannot open primes file.\n";
		return 1;
	}

	char primeNum[6];
	primeNum[5] = 0;

	while(in)
	{
		in.getline(primeNum, 10);
		if(isPrimeSeries(primeNum))
			cout << primeNum << endl;
	}

	in.close();

	system("pause");

	return 0;
}

تم تعديل هذه المشاركة بواسطة namespace في 30 يوليو 2010 في 00:47

البرمجة = الرياضيات

#245

سأحل الفرع الثالث بطريقة جديدة ، لا داعي لدوران من 10000 إلى 100000 أو ما شابه ، ذكرت لكم خصائص العدد ، الخانة أقصى اليسار بالإضافة إلى باقي الخانات ، تفضلوا :

#include<iostream>
using namespace std;

bool isPrime(int n)
{
    if(n%2 == 0)
		if(n == 2) return true;
		else return false;

	if(n == 1) return false;

    int limit = n;
    int i = 3;

    while(limit>i)
    {
        if(n%i == 0)
            return false;

        limit = n/i;
        i += 2;
    }

    return true; 
}

int main()
{
	int p[] = {2, 3, 5, 7};
	int o[] = {1, 3, 7, 9};

	int prime;

	for(int a=0; a<4; a++)
		for(int b=0; b<4; b++)
		{
			prime = p[a]*10 + o;

			if(!isPrime(prime))
				continue;

			for(int c=0; c<4; c++)
			{
				prime = (p[a]*10 + o)*10 + o[c];

				if(!isPrime(prime))
					continue;

				for(int d=0; d<4; d++)
				{
					prime = ((p[a]*10 + o)*10 + o[c])*10 + o[d];

					if(!isPrime(prime))
						continue;

					for(int e=0; e<4; e++)
					{
						prime = (((p[a]*10 + o)*10 + o[c])*10 + o[d])*10 + o[e];

						if(isPrime(prime))
							cout << prime << endl;
					}
				}
			}
		}

	return 0;
}

وهذه هي الطريقة الاعتيادية لكن باستخدام اقتران لفحص العدد :

#include<iostream>
using namespace std;

bool check(int x)
{
	while(x>0)
	{
		if(!isPrime(x))
			return false;

		x/=10;
	}

	return true;
}

int main()
{
	for(int i=10000; i<100000; i++)
		if(check(i))
			cout<<i<<endl;

	return 0;
}

هذا كان كل شيء بخصوص اللغز الخامس

شكراً على الحلول الإبداعية من الزملاء ، آمل أن نكون استفدنا وأفدنا ، وأتمنى أن يستمر الإقبال على المسابقة بهذا الحماس

شكر خاص للزميل أبو دحيم على حلوله الرائعة ، في المرة القادمة عليك الاسراع بتسليم الحل :lol:

أرجو المسامحة من الجميع ، بذلت كل ما بوسعي ، الهدف الأساسي هو الفائدة وقد تحقق بفضل الله

أترك المجال الآن للزميل محمد علاء الدين لطرح لغزه السادس

بالتوفيق

تم تعديل هذه المشاركة بواسطة namespace في 31 يوليو 2010 في 00:00

البرمجة = الرياضيات

#246

بسم الله الرحمن الرحيم

اللغز السادس

مقارنة النصوص

يوجد نوعين من اساليب مقارنة النصوص اولهم هو اسلوب تطابق النصوص Exact Match و يتلخص فى مقارنة نصين حرف بحرف و الإسلوب الثانى هو اسلوب تشابه النصوص Pattern Match و يتلخص فى مطابقة نص لشروط معينه، فمثلا إذا افترضنا ان العلامه % تعنى رقم او اكثر و كان لدينا النص "123456" و اردنا مطابقة هذا النص لهذه العلامه سيكون الناتج وجدد تشابه و ذلك لأن النص يحتوى بأكمله على أرقام. هذا النوع من المقارنه هو محور هذا التمرين.

لا تقلق لقد نزعت عنك عناء برمجة دوال للبحث و المقارنه و غيرهم و قمت ببرمجتهم لك حتى تركز فى محتوى التمرين و يمكنك استخدامهم او تركهم، الأمر عائد لك.

المطلوب منك صناعة مجموعه من الدوال التى تتيح للمبرمج مقارنة النصوص بإسلوب التشابه Pattern Match و إليك القواعد التى ستتبعها:

المجموعه الأولى:

  • # تعنى رقم واحد فقط.
  • % تعنى صفر او اكثر من رقم (صفر تعنى لا شئ).
  • ؟ تعنى حرف ابجدي واحد فقط.
  • $ تعنى صفر او اكثر من حرف ابجدي (صفر تعنى لا شئ).
  • * تعنى صفر او اكثر من اى شئ (صفر تعنى لا شئ).

المجموعه الأولي تستخدم لمطابقة مجموعه متجانسه من الرموز، مثال:

Is       "3.14"       Like "#.##"  = True
Is       "3.14"       Like "#%.%"  = True
Is       "3.e+2"      Like "#.?+%" = True
Is "I'm 25 years old" Like "*"     = True
Is         ""         Like "*"     = True

يمكنك ملاحظة انى استخدمت النقطه فى الأمثله الثلاثه الأولى و هذا ايضا من ضمن الشروط، و هو امكانية كتابة ما تشاء ضمن الـ Pattern و إن قمت بكتابة اى من رموز المجموعه الأولي لن يتم التعامل معه على أنه حرف عادى.

المجموعه الثانيه:

  • [charlist] تعنى هذا المكان يحتوى على اى حرف من الموجودين داخل charlist
  • [charlist!] تعنى هذا المكان يحتوى على اى حرف ماعدا الموجودين داخل charlist

هذه المجموعه تتيح مطابقة الحرف فى الموقع الحالي داخل النص بأى من الموجودين داخل المدى [] او بكل الحروف ماعدا الموجوده داخل المدى [] (بالطبع مع وجود العلامه ! - و تعنى not).

هذه المجموعه لها بعض الخصائص لها و هى:

1 - إذا كنت تريد مطابقة مجموعه متتاليه من الحروف يمكنك استخدام العلامه - (Dash) للفصل بين الحرف الأول و الأخير، مثلا [A-D] و هى تماثل [ABCD].

2 - إذا كنت تريد مطابقة اكثر من مدى فى نفس الوقت يمكنك الفصل بينهم بالعلامه | (or) مثلا [A-D|T-Z] و تعنى ان الحرف اما ان يكون فى المدى من A إلى D او فى المدى من Q إلى Z، ايضا يمكنك كتابتها بالشكل التالى [A-D|TUVWXYZ] او الشكل التالى [A-D|TUV|W-Z]، دائما ما يكون المدى بين حرفين فقط و يفصل بين المدى و الذى يليه علامة |.

حتى الأن السابق كله اجبارى و التالى هو اختيارى، و من سيقوم بتضمين الجزء التالى له الأولويه فى المراكز الاولى (على اعتبار انه انهى الجزء السابق دون مشاكل)

يسمح بإستخدام العلامات |!- داخل النص كحروف عاديه و ايضا القوسين [] و يتم تمييز إذا ما كان القوسين يستخدموا كحروف عاديه او اقواس لتحديد مدى يتم من السياق.

مدة التمرين هى 5 ايام يتم احتسابها من الغد ( إذا تم احتسابه من الأن سيضيع على المشاركين تقريبا نصف يوم، انظروا لوقت وضع اللغز ).

بالمرفقات الملفين strings.h و strings.cc و اللذان يحتويان على الدوال المساعده و تضمينهم و الدوال هى التاليه:

/***********************************************
*
*   Copyright (C) 2010 Muhammad alaa
*
* this code came from my StrLib Library, you can found more
* information about it at http://strlib.sourceforge.net/
*
***********************************************/

#ifndef STRINGS_H
#define STRINGS_H

// flags for string operations
enum StringFlags
{
	None           = 0,  // empty flag, mean use function default flags
	SearchStepWord = 1,  // used in countOf and indexesOf
	SearchStepChar = 2,  // used in countOf and indexesOf
	IgnoreCharCase = 4,  // used in countOf and indexesOf
};


// get length of null-terminated string
int
length(
	const char* str
);


// get part of string as new string
char*
substring(
	const char* str,
	int startIndex,
	int count
);


// get position of find in str using options
// search done from beginning to end
int
indexOf(
	const char* str,
	const char* find,
	int startIndex,
	int count,
	bool ignoreCase
);


// get position of find in str using options
// search done from end to beginning
int
lastIndexOf(
	const char* str,
	const char* find,
	int startIndex,
	int count,
	bool ignoreCase
);

// get position of any of characters of find in str using options
// search done from beginning to end
int
indexOfAny(
	const char* str,
	const char* find,
	int startIndex,
	int count,
	bool ignoreCase
);


// get position of any of characters of find in str using options
// search done from end to beginning
int
lastIndexOfAny(
	const char* str,
	const char* find,
	int startIndex,
	int count,
	bool ignoreCase
);


// get array of all position of find in str using options
// last parameters returns array length
int*
indexesOf(
	const char* str,
	const char* find,
	int startIndex,
	int count,
	StringFlags flag,
	int& resultLen
);

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 30 يوليو 2010 في 15:03

1

مدونتي: C++ Tips and Tricks

#247

ياجماعة, قلت سابقا لاتدعوا أحد من مشرفي قسم ال C++ يفوز بالمسابقة... :D

بالمناسبة أخ محمد,, هل العلامات المذكوره هنا (?, #, ....) و أثرها هي من الطرق القياسية ضمن regex ؟

#248
اقتباس
بالمناسبة أخ محمد,, هل العلامات المذكوره هنا (?, #, ....) و أثرها هي من الطرق القياسية ضمن regex ؟

لا اعرف فأنا لم ادرس الـ Regex بعد، و لكن هذه العلامات و تأثرها اخذته من المعامل Like الموجود بلغة الـ VB بالطبع مع بعض التعديلات و الإضافات لجعل السؤال يحتوى على افكار.

مدونتي: C++ Tips and Tricks

#249
هويدي كتب:

ياجماعة, قلت سابقا لاتدعوا أحد من مشرفي قسم ال C++ يفوز بالمسابقة... :D

بالمناسبة أخ محمد,, هل العلامات المذكوره هنا (?, #, ....) و أثرها هي من الطرق القياسية ضمن regex ؟

:lol:

نفس الشيئ أرى أنه من المفترض أنه مشرفي قسم السي++ لا يسمح لهم بالفوز لكن يسمح لهم بالمشاركة :P

لغزك صعب يا مشرفنا أبحاول أحله لكن حقيقة أخشى من الفشل :(

#250
اقتباس
نفس الشيئ أرى أنه من المفترض أنه مشرفي قسم السي++ لا يسمح لهم بالفوز لكن يسمح لهم بالمشاركة :P

إذا اردتم ألا تجعلونى اضع اللغز القادم فعلى احد منكم ان يحل اللغز :P و اعرف انكم ستفعلوا

اقتباس
لغزك صعب يا مشرفنا أبحاول أحله لكن حقيقة أخشى من الفشل :(

هذا غير صحيح فاللغز سهل و لكنك تحتاج ان تفكر فى الكيفيه التى ستحله بها و لا تخشي من الفشل لأن طريق النجاح يمتلء بالمحاولات الغير ناجحه.

انا ايضا لم احله بعد و سأبدء فيه من الغد إن شاء الله.

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

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 30 يوليو 2010 في 14:28

1

مدونتي: C++ Tips and Tricks

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…