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

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

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

لقد بدأت اليوم في الحل,,, لكن لي سؤال..

ماذا لو تم جمع الرقم 999999 إلى 40 خانه + الرقم 99999 إلى أربعين خانه,,, الناتج سيكون

19999999999999999999999999999999999999998

الذي هو 41 خانه, هل هذا مقبول؟؟

#177
محمد علاء الدين كتب:

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

1 - لماذا 40 خانه بالتحديد؟

2 - لماذا كل خانه تحتوى فقط على الأرقام من 0 و حتى 9؟

بهذا الإسلوب سنحتاج لكتابة كود اكبر مما كنا سنكتبه إذا اردنا عمل Arbitrary-precision integer حقيقى :wink: و ذلك للتحقق من overflow و underflow و خلافه!!

أخ أبو دحيم، هل يمكننى المشاركه دون التقيد بالشرطين محور السؤالين السابقين؟

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

أهلا بك أخي :)

آسف على التأخر بالرد

لم أفهم قصدك بالضبط أخي الكريم ؟؟

بالنسبة لماذا 40 خانة ليس هنالك سبب بل وضعت هكذا ولكي نبعد بشكل لا بأس به عن أقصى حجم تتحمله اللغه ( 4 byte for int type) أي ليس هنالك سبب لإختيار هذا العدد إن كان لديك شيئ تريد الإستفسار عنه بالضبط تفض واسئل فأنا لم أفهم ما المغزى من سؤالك أشعر أن لديك شيئا ما خلفه يحتاج للتوضيح :)

بالنسبة لماذا كل خانة من 0 وحتى 9 لأن هذا حد الرقم العشري ووضعتها كتنبيه وليس شرط للسؤال فإن كان لديك حلا آخر يحتاج أن تستعمل شيئا غير ذلك لا بأس كما تريد

بإمكانك إجتيازهما بالتأكيد فكما وضحت لك الأول وضعته ليكون كبيرا كفاية والآخر مجرد تنبيه :)

حياك الله وآسف على التأخير :)

هويدي كتب:

لقد بدأت اليوم في الحل,,, لكن لي سؤال..

ماذا لو تم جمع الرقم 999999 إلى 40 خانه + الرقم 99999 إلى أربعين خانه,,, الناتج سيكون

19999999999999999999999999999999999999998

الذي هو 41 خانه, هل هذا مقبول؟؟

نعم مقبول ذلك فأنا لم أحدد أن تجعل هنالك أوفر فلو وتقف عند 40 خانة أو أن تضع خانة كافية للمجموع :)

حياك الله

#178

اعتقد انه لابد ان توجد وسيلة لطباعة محتوى الأرقام (مثل اعادة تعريف المعامل << للـ ostream ليتم استخدامها مع cout)، فهل انا مصيب ؟

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

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

#179
محمد علاء الدين كتب:

اعتقد انه لابد ان توجد وسيلة لطباعة محتوى الأرقام (مثل اعادة تعريف المعامل << للـ ostream ليتم استخدامها مع cout)، فهل انا مصيب ؟

نعم أخي

هكذا كان الأمر بالنسبة لي

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

#180
اقتباس
اعتقد انه لابد ان توجد وسيلة لطباعة محتوى الأرقام (مثل اعادة تعريف المعامل << للـ ostream ليتم استخدامها مع cout)، فهل انا مصيب ؟

هل تقصد لمجرد طباعة الرقم؟

أنا أستخدم C لحل هذا اللغز... لذا سأقوم بالطباعه بواسطة داله :

void print(BigInteger*)
#181

حتى الأن لم اقم بعمل المشيد الخاص بالتحويل من النص و ايضا لم اقم بعمل overload للـ ostream لطباعة النص. :wacko:

--------------------

بعد الإنتهاء من المثال خاصتي، هل أضعه هنا، ام ماذا افعل ؟؟ (معذره لم اكن اتباع معكم المسابقات :blush: )

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

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

#182

بل أرسلة لأبو دحيم على الخاص, حتي يأتي يوم النتائج و سيقوم هو بعرض النتائج الفائزه..

#183

تمام يا افندم

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

#184

غدا هو آخر يوم لحل اللغز :)

عند إنتهاء يوم الغد سوف تنتهي المسابقة :)

وفق الله الجميع :)

#185
اقتباس
تمام يا افندم

إنت دخلت جيش؟؟؟ الكلمة دي مشهوره هناك جدا... :D

#186

بصراحه يا جماعه لغز تقيل, و أتقل ما فيه إن الواحد مضطر أن يتعامل مع ال C نفسها ... في المسائل السابقه كان الهدف هو الوصول لحل اللغز... أما هذه المسأله, ففكره حل اللغز نفسها مباشره (جمع + طرح) أما ما أراه صعب هو التعامل مع C ,,

"C give you the robe to hang yourself" صحيح :D

أنا الحمد لله, تقريبا خلصت اللغز, سأقوم بعمل مجموعه من ال test cases ....

#187

ارجو ان يكون حلي وصلك .. أخ ابو دحيم ..... لانه ماوصلني رد منك بالاستلام ..

ترا ارسلك عتوقه:P

تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#188

انا خلصت اغلب الفئه بس طباعة النص هى اللي هتسبب لي الجنون

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

#189

تم الإرسال

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

#190

تم الإستلام من كل من namespace + هويدي + محمد علاء الدين + omani فقط :)

إن كان هنالك شخص آخر أرسل فليخبرني :)

هذا هو اليوم الاخير :)

يبدوا أنني سأواجه مشاكل في فهم الأكواد وأيضا سأواجه مشاكل في تحديد من الفائز يارب كن معي :wacko:

تم تعديل هذه المشاركة بواسطة أبو دحيم في 19 يوليو 2010 في 21:58

1 −1
#191

النتيجة الإبتدائية :)

استلمت من كل من

1) aohammed

2) OMANI

3) محمد علاء الدين

4) هويدي

5) namespace

جميع هؤلاء الأعضاء حاولوا ولكن من وصلوا للحل الصحيح هم:

1) هويدي

2) namespace

غدا بإذن سأحدد أيهما الفائز :blush:

مع أن الحكم بينهما صعب جدا :wacko:

#192

غريبه انا هبدء اشك فى نفسى دى تانى مره افشل فى حل لغز فى الموضوع ده :blush: ، شكلى مبعرفش احل مسابقات.

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

#193
اقتباس
غريبه انا هبدء اشك فى نفسى دى تانى مره افشل فى حل لغز فى الموضوع ده blush.gif ، شكلى مبعرفش احل مسابقات.

لا خالص,,

أولا إنت بدأت متأخر عننا

ثانيا إنت اكيد بتحاول في الطريق الصعب بتاع المحترفين,, أما أنا مثلا فباخد أسهل طريق للوصول للحل....

1
#194
أبو دحيم كتب:

جميع هؤلاء الأعضاء حاولوا ولكن من وصلوا للحل الصحيح هم:

1) هويدي

2) namespace

غدا بإذن سأحدد أيهما الفائز :blush:

مع أن الحكم بينهما صعب جدا :wacko:

أحلى هويدي

أنا عاوز أعرف انت ناوي على إيه ؟

اتركني بحالي يا أخي :lol:

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

#195
اقتباس

لا خالص,,

أولا إنت بدأت متأخر عننا

ثانيا إنت اكيد بتحاول في الطريق الصعب بتاع المحترفين,, أما أنا مثلا فباخد أسهل طريق للوصول للحل....

مجامله لطيفه منك اخى هويدى، بارك الله فيك و فيكم جميعا.

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

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

#196
اقتباس
حلى هويدي

أنا عاوز أعرف انت ناوي على إيه ؟

اتركني بحالي يا أخي laugh.gif

هههه

اقتباس
مجامله لطيفه منك اخى هويدى، بارك الله فيك و فيكم جميعا.

أبدا يا أخي, فأنت بالنسبة لي بمعرفتك البرمجية هدف قد أصل إليه بعد 10 سنين من الآن....

#197

السلام عليكم ورحمة الله وبركاته

أهلا بكم

حقيقة جلست وقت طويلا كي أرى البرنامجين لكل من هويدي و namespace واحترت بينهم حقيقة ولكن قبل أن أبين اختياري بينهم سأضع برنامجهما أولا :

namespace

#include<iostream>
using namespace std;

int len(char ch[])
{
        int length = 0;

        for (int i=0; ch!='\0'; i++)
                length++;

        return length;
}

bool isLarger(int a[], int b[], int size1, int size2)
{
        if(size1 > size2) return true;  // then a>b
        if(size1 < size2) return false; // then b>a

        // when sizes are the same 
        for(int i=40-size1; i<40; i++)
        {
                if(a > b) return true;  // then a>b
                if(a < b) return false; // then b>a
        }

        return true; // although they are equal
}

void print(int result[], int max, bool sign)
{
        int sum = 0;
        int d = 0;
        int i;

        // when addition, print the carry on the leftmost if exists
        if(result[40 - max - 1] == 1) d = -1;

        // find the sum of all elements in result
        for(i = 40 - max + d; i<40; i++)
                sum += result;

        cout<<endl;

        if(sign) cout << '-';

        bool zeros = true; // we need it to neglect all zeros on the left of the result

        // check if all digits are zeros
        if(sum == 0)
                cout << 0;

        else
        for(i = 40 - max + d; i<40; i++)
        {
                // don't print until you find first nonzero digit
                if(result == 0 && zeros) continue;

                zeros = false;

                cout << result;
        }

        cout<<endl;
}

void main()
{
        // declaring necessary variables
        int choice;

        char n1[41];
        char n2[41];

        int num1[40] = {0};
        int num2[40] = {0};
        int result[41] = {0};

        int i;
        int max;
        int sum;
        int carry = 0;

        bool sign=false;

        // printing the menue
        cout<<"Please select from the following menu :\n\n"

                <<"[1] Find the sum of two numbers.\n"
                <<"[2] Find the subtraction of two numbers.\n"
                <<"[3] Exit\n\n"

                <<"Enter your choice : ";

        cin >> choice;

        if(choice != 1 && choice != 2)
                exit(0);

        cout<<"\nPlease insert the two numbers :\n\n";
        cin >> n1 >> n2;

        // calculate the sizes of the numbers
        int size1 = len(n1),
                size2 = len(n2);

        // convert from character arrays to integer arrays
        for(i=0; i<size1; i++)
                num1[i + 40 - size1] = n1 - 48; // 48 is the ASCII of '0'

        for(i=0; i<size2; i++)
                num2[i + 40 - size2] = n2 - 48;

        // set the max size
        max = size1;

        if(size2 > max)
                max = size2;

        // * * * NOW PROCESSING * * *

        // summation
        if(choice == 1)
        {
                for(i=40-1; i>=40-max; i--)
                {
                        sum = num1 + num2 + carry;
                        result = sum%10;
                        carry = sum/10;
                }
                result = carry;
        }

        // subtraction
        if(choice == 2)
        {
                int s1 = -1, s2 = 1;

                // check : is num1 > num2 ?
                if(isLarger(num1, num2, size1, size2))
                {
                        s1 = 1;
                        s2 = -1;
                }
                else sign=true; // negative answer

                carry = 0;

                for(i=40-1; i>=40-max; i--)
                {
                        sum = carry + s1*num1 + s2*num2;

                        if(sum<0)
                        {
                                carry = -1;
                                sum += 10;
                        }
                        else carry = 0;

                        result = sum;
                }
        }

        print(result, max, sign);

        system("pause");
        system("cls");

        main();
}

وأيضا أرسل لي طريقة أخرى تعتمد على البرمجة الكائنية ولكن بعد إنتهاء الوقت وهاهي الطريقة :

#include<iostream>
using namespace std;

int len(char ch[])
{
        int length = 0;

        for (int i=0; ch!='\0'; i++)
                length++;

        return length;
}

bool s;

class myint
{
        int num[40];

        short size;

        bool sign, overflow;

public:

        myint()
        {
                for(int i=0;i<40;i++)
                        num=0;

                size = 0;

                overflow = sign = false;
        }

        bool operator<(myint m)
        {
                if(size < m.size) return true;
                if(size > m.size) return false;

                for(int i=40-size; i<40; i++)
                {
                        if(num < m.num) return true;
                        if(num > m.num) return false;
                }

                return false; // although they are equal
        }

        myint operator+(myint m)
        {
                myint result;

                int max = size;

                if(size > max) max = m.size;

                bool over = (max == 40); // first condition to satisfy the overflow

                int sum, carry = 0;

                for(int i=40-1; i>=40-max; i--)
                {
                        sum = num + m.num + carry;

                        result.num = sum%10;

                        carry = sum/10;
                }

                if(carry == 1)
                        if(over) result.overflow = true; // if so, i is equal to -1
                        else result.num = carry; // i >= 0

                result.size = max;

                return result;
        }

        myint operator-(myint m)
        {
                if(*this < m)
                {
                        s = true; // store the sign in the global variable, to preserve the value
                                          // in case the function calls itself, otherwise it will be lost

                        return m - *this; // returns n2 - n1 but with -ve sign
                }

                myint result;

                int max = size;

                if(size > max) max = m.size;

                int carry = 0, sum;

                for(int i=40-1; i>=40-max; i--)
                {
                        sum = carry + num - m.num;

                        if(sum < 0)
                        {
                                carry = -1;
                                sum += 10;
                        }
                        else carry = 0;

                        result.num = sum;
                }

                result.size = max;
                result.sign = s;

                return result;
        }

        friend ostream operator<<(ostream out, myint m)
        {
                int sum = 0;
                int d = 0;
                int i;

                if(m.num[40 - m.size - 1] == 1) d = -1;

                for(i = 40 - m.size + d; i<40; i++)
                        sum += m.num;

                out << endl;

                if(m.sign) out << '-';

                bool zeros = true;

                if(sum == 0 && !m.overflow)
                        out << 0;

                else
                {
                        if(m.overflow) out << 1;

                        for(i = 40 - m.size + d; i<40; i++)
                        {
                                if(m.num == 0 && zeros) continue;

                                zeros = false;

                                out << m.num;
                        }
                }

                return out;
        }

        friend istream operator>>(istream in, myint & m)
        {
                char n[41]; in>>n;

                m.size = len(n);

                for(int i=0; i<m.size; i++)
                        m.num[i + 40 - m.size] = n - 48;

                return in;
        }
};

void main()
{
        int choice;

        myint n1, n2;

        s = false;

        cout<<"Please select from the following menu :\n\n"

                <<"[1] Find the summation of two numbers.\n"
                <<"[2] Find the subtraction of two numbers.\n"
                <<"[3] Exit\n\n"

                <<"Enter your choice : ";

        cin >> choice;

        if(choice != 1 && choice != 2)
                exit(0);

        cout<<"\nPlease insert the two numbers :\n\n";
        cin >> n1 >> n2;

        if(choice == 1)
                cout << n1 + n2 << endl;

        if(choice == 2)
                cout << n1 - n2 << endl;

        system("pause");
        system("cls");

        main();
}

هذا هو حل أخي namespace

أما بالنسبة لحل أخي هويدي فهاهو :

//BigInteger.h

#ifndef BIG_INTEGER_H
#define BIG_INTEGER_H

typedef struct {
        char *data;
        size_t length;
        short sign; // 0 for positive (default value), otherwise for negative
} BigInteger;

// BigInteger interface functions

/**
 * The char array are provided from right to left, for example if you want to reprensent the number 200, you
 * should use array looks like:
 * char arr[] = {0, 0, 2};
 */
BigInteger* construct(char[], size_t);
BigInteger* add(BigInteger*, BigInteger*);
BigInteger* subtract(BigInteger*, BigInteger*);
char* get(BigInteger*);
void print(BigInteger*);

// utility functions
static void intcpy(char*, char*, int);
static char** get_adjusted(BigInteger*, BigInteger*);


#endif

//BigInteger.c

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

#include "BigInteger.h"

BigInteger* construct(char data[], size_t length) {
        if (length > 40)
                return NULL;
        BigInteger* bi = malloc(sizeof(BigInteger*));
        bi->length = length;
        bi->data = malloc(bi->length*sizeof(char));
        intcpy(bi->data, data, bi->length);
        return bi;
}

BigInteger* add(BigInteger* x, BigInteger* y) {
        char* add_data(char*, char*, int*);

        int len = (x->length > y->length) ? x->length : y->length;

        char** resized = get_adjusted(x, y);
        char* tmp_x = resized[0];
        char* tmp_y = resized[1];

        char* ret = add_data(tmp_x, tmp_y, &len);
        if (ret == NULL)
                return NULL;

        BigInteger *b = construct(ret, len);

        return b;
}

BigInteger* subtract(BigInteger* x, BigInteger* y) {
        char** resized = get_adjusted(x, y);
        char *tmp_x = resized[0];
        char *tmp_y = resized[1];

        enum Sign {
                EQUAL = 0, POSITIVE = 1, NEGATIVE = 2
        };

        short ret_sign = EQUAL;

        int i;
        for (i = x->length - 1; i >= 0; i--) {
                if (tmp_x == tmp_y)
                        continue;
                else if (tmp_x > tmp_y) {
                        ret_sign = POSITIVE;
                        break;
                } else {
                        ret_sign = NEGATIVE;
                        break;
                }

        }

        BigInteger* bi;
        if (ret_sign == EQUAL) {
                char ret[1] = {0};
                bi= construct(ret, 1);
        }else if (ret_sign == POSITIVE){
                char ret[x->length];
                for (i=0; i<x->length;i++){
                        int tmp = tmp_x-tmp_y;
                        if (tmp <0){
                                tmp_x[i+1]--;
                                tmp = (tmp_x+10)-tmp_y;
                        }
                        ret = tmp;
                }
                bi=construct(ret, x->length);
        }else{
                char ret[y->length];
                for (i=0; i<y->length;i++){
                        int tmp = tmp_y-tmp_x;
                        if (tmp <0){
                                tmp_y[i+1]--;
                                tmp = (tmp_y+10)-tmp_x;
                        }
                        ret = tmp;
                }
                bi=construct(ret, y->length);
                bi->sign = 1;
        }

        return bi;
}

char* get(BigInteger* bi) {
        return bi->data;
}

void print(BigInteger* bi) {
        char* d = bi->data;
        if (bi->sign) printf("%c", '-');
        int i;
        for (i = (bi->length)-1; i>=0; --i) {
                printf("%i", d);
        }
        printf("n");
}

char* add_data(char* x, char* y, int *len) {
        int i, reminder = 0;
        char *ret = malloc(sizeof(char) * *len);

        for (i = 0; i < *len; i++) {
                int tmp = x + y + reminder;
                ret = tmp % 10;
                reminder = (tmp - ret) / 10;
        }

        if (reminder) {
                if (i==40){
                        fprintf(stderr, "Arithmetic OverFlown");
                        return NULL;
                }else{
                        ret =reminder;
                        (*len)++;
                }
        }
        return ret;
}

static void intcpy(char* dest, char* src, int l) {
        while (l-- > 0)
                *dest++ = *src++;
}

static char** get_adjusted(BigInteger* x, BigInteger *y) {
        char **ret = malloc(sizeof(char**));
        int len = (x->length > y->length) ? x->length : y->length;

        char *tmp_x = get(x);
        char *tmp_y = get(y);

        int diff;
        if ((diff = len - x->length) > 0) {
                intcpy(tmp_x, get(x), len);
                while (diff > 0) {
                        tmp_x[x->length++] = 0;
                        diff--;
                }
        } else if ((diff = len - y->length) > 0) {
                intcpy(tmp_y, get(y), len);
                while (diff > 0) {
                        tmp_y[y->length++] = 0;
                        diff--;
                }
        }
        ret[0] = tmp_x;
        ret[1] = tmp_y;
        return ret;
}

//main.c

#include <stdio.h>
#include "BigInteger.h"

void test_add1() {
        printf("Start Testing ADD n");
        char d1[] = { 1, 2};            // from right to left, so its value is 21
        char d2[] = { 5};                       // and this is 5

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = add(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}
void test_add2() {
        printf("Start Testing ADD n");
        char d1[40];
        char d2[40];

        int i=0;
        for (i=0; i<40;i++){
                d1 = 3;
                d2 = 5;
        }

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = add(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

/**
 * Will print "Arithmetic Overflow" and returns NULL
 */
void test_add3() {
        printf("Start Testing ADD n");
        char d1[40];
        char d2[40];

        int i=0;
        for (i=0; i<40;i++){
                d1 = 5;
                d2 = 5;
        }

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = add(bi1, bi2);
        if (ret == NULL)
                printf("NULLn");
        //print(ret);
        printf("End Testing...n");
}

void test_add4() {
        printf("Start Testing ADD n");
        char d1[] = { 9, 9};
        char d2[] = { 9, 9};

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = add(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

void test_add5() {
        printf("Start Testing ADD n");
        char d1[] = { 1, 2, 0, 0, 1, 2, 3, 4, 5, 9 ,3, 1, 3, 4, 4, 2, 1};               // from right to left, so its value is 21
        char d2[] = { 1, 3, 3, 4, 5, 5, 3, 0, 0, 0, 0, 0, 2, 1, 1, 1, 9};                       // and this is 5

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = add(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

void test_subtract1() {
        printf("Start Testing SUBTRACT n");
        char d1[] = { 1, 2};            // this is 21
        char d2[] = { 5, 2};            // and this is 25

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = subtract(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

void test_subtract2() {
        printf("Start Testing SUBTRACT n");

        char d1[] = { 9, 9};
        char d2[] = { 9, 9};

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = subtract(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

void test_subtract3() {
        printf("Start Testing SUBTRACT n");

        char d1[40];
                char d2[40];

                int i=0;
                for (i=0; i<40;i++){
                        d1 = 3;
                        d2 = 5;
                }

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = subtract(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}

void test_subtract4() {
        printf("Start Testing SUBTRACT n");

        char d1[] = { 1, 2, 0, 0, 1, 2, 3, 4, 5, 9 ,3, 1, 3, 4, 4, 2, 1};               // from right to left, so its value is 21
        char d2[] = { 1, 3, 3, 4, 5, 5, 3, 0, 0, 0, 0, 0, 2, 1, 1, 1, 9};                       // and this is 5

        BigInteger* bi1 = construct(d1, sizeof(d1) / sizeof(char));
        BigInteger* bi2 = construct(d2, sizeof(d2) / sizeof(char));
        print(bi1);
        print(bi2);
        BigInteger *ret = subtract(bi1, bi2);
        print(ret);
        printf("End Testing...n");
}


int main(void) {
        test_add1();
        test_add2();
        test_add3();
        test_add4();
        test_add5();
        test_subtract1();
        test_subtract2();
        test_subtract3();
        test_subtract4();
        return 0;
}

قبل أن أقول من الفائز أحب أن أوضح أن البرنامجان يعملان بشكل ممتاز وكلاهما يمتلكان نفس المميزات فكلاهما يجمعنا ويطرحان بشكل صحيح وكلاهما وضعا ميزة أنه في حالة العدد الاول أصغر من الثاني في الطرح يطرح الرقمين ويضع علامة " - " لذلك احترت كثيرا بينهما وقد رشحت أخي namespace للفوز لعدة أسباب وهي:

1) أن البرنامج more readability وأسهل بالتتبع والقرائة بعكس برنامجي اخي هويدي ( تعبت كثيرا لقلة خبرتي باللغة ولكثرة استعمالة المؤشرات ).

2) حسب ما فهمت من برنامج أخي هويدي أنه اتعمل طريقة البرمجة الشيئية أو الكائنية ولكن من دون وجود كائنات وما يؤكد ذلك هو وضعه فنكشن constructor وهذا موجود دائما في البرمجة الشيئية ( هذا ما فهمته من البرنامج إن كنت مخطئا فصحح لي ).

3) برنامج أخي namespace يعتبر friendly وأسهل بكثير بالتعامل بعكس برنامج أخي هويدي حيث أنه أصعب قليلا.

وطبعا رغم كل ذلك يبقى برنامج أخي هويدي رائعا وجدا وكل ما ذكر لا يقلل من شأنة بل ما عمله يعتبر عمل رائع ولكن أرى أن الجافا بطريقتها الكائنية أثرت على برامجه :lol:

هذا ما رأيته ( وشاركني فيه والدي أيضا :lol: ) وأرجوا أن لا أكون ظلمت أحدا في هذا اللغز وحقيقة وجدت برامج رائعة جدا ( مثل برنامج مشرفنا رائع جدا ويوجد في تعليقات كثيرة وهذا يأكد خبرته الكبيرة في البرمجة ولكن للأسف به أخطاء وناقص لأنه لم يبدأ به إلا متأخرا ).

هذا مالدي إن أصبت فمن الله وإن أخطأت فمن نفسي والشيطان.

لكم جزيل الشكر وتشرفت في مشاركتي معكم حقيقة ويسعدني ذلك

بإنتظارك أخي namespace <<<<<<<<<<< وإن كنت مصرا على عدم وضع اللغز فبالتأكيد سينتقل الأمر للمشرف الرائع أخي هويدي ;)

1
#199

اخي أبو دحيم .. عليك أيضاً وضع بقية الحلول ..

تقبل تحياتي

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#200

مبروووك للأخ حمزه (Namespace) :D

ألف مبروك يا أخي, حقا تستحقها, فأنت أستاذنا و معلمنا :D

أرجو أخي أبو دحيم أن تضع كل الحلول المرسلة إليك لكي نستفقد منا,,,, بعد إذن أصحابها طبعا...

بالنسبة لنقطة البرمجة الكائنيه,,, فأري أن ليس كل المشاكل يجب أن تحل بها,,, كما أنه هناك بعض الحالات التي يفضل أن يتم إستخدام البرمجة الكائنية بها, و خير مثال على ذلك هو الحل الثاني للأخ حمزه حيث أبدع في إستخدام ال operator overloading و بهذا نقل كل المنطق إلى الفئة...

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

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

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

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

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

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