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

ماهي أقصر طريق لمعرفة الأعداد التتابعية ؟

بدأه Snack3r في 28 يونيو 2012 · 29 رد · 2,700 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لاحظت مؤخرا وجود أعضاء نشطين في القسم, ففكرت في طرح سؤال يكون في البداية سهل و يمكننا زيادة درجة صعوبته في كل مرة.

في هذا الموضوع, نهتم بالأعداد الصحيحة التي تتكون من n رقم و تحقق الخاصية التالية :

انطلاقا من أرقام العدد, نبني متتالية عن طريق حساب مجموع آخر n رقم لتحديد العنصر القادم.

في مرحلة معينة ستؤول المتتالية إلى قيمة العدد التتابعي.

مثال :

x= 197//أرقام العدد هم 1,9 و 7
1 + 9 + 7 = 17
9 + 7 + 17 = 33
7 + 17 + 33 = 57
17 + 33 + 57 = 107
33 + 57 + 107 = 197
العدد 197 ظهر في المتتالية, إذا فهو تتابعي.

مثال آخر :

x=25//أرقام العدد : 2 و 5
2,5,7,12,19,31,..
العدد 25 لا يظهر في قيم المتتالية لذا فهو غير تتابعي

السؤال :

اكتب برنامج بالسي أو السي++ يطلب من المستخدم إدخال عدد صحيح n, ثم يُظهر له جميع الأعداد التتابعية المُكونة من n رقم.

الإجابة تُرسل على الخاص حتى لا يتم حرق السؤال.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 28 يونيو 2012 في 01:57 — السبب: إصلاح أخطاء مطبعية :)

1
#2
أحمد الشنقيطي كتب:

مثال :

x= 197//أرقام العدد هم 1,9 و 7
17 = 1+9+7
33 = 9+7+17
57 = 1+17 +33
107=17+33+57
197= 33+57+107
العدد 197 ظهر في المتتالية, إذا فهو تتابعي.

شكرا أستاد شنقيطي على مثل هذه الأسئلة

ونتمنى تكون أجوبتنا عند حسن ظنك

فقط أريد أن أشير أن هناك خطأ بسيطا في الكود وجب التنبيه له

x= 197//أرقام العدد هم 1,9 و 7
17 = 1+9+7
33 = 9+7+17
57 = 7+17 +33 // !(1+17 +33)
107=17+33+57
197= 33+57+107
العدد 197 ظهر في المتتالية, إذا فهو تتابعي.

ووفقنا وياك لما هو خير لهذه الأمة

i love you mama

#3

شكرا أخي مومو, تم تعديل المشاركة.

و بانتظار محاولتك للسؤال :)

#4

السلام عليكم أستاذ أحمد ...

جزاك الله خيرا على هذه المبادرة في المنتدى ... هناك ملاحظة صغيرة جداً ..

أرجو ألا تتوقف .. حتى عندما لا يوجد أي نشاط في المنتدى .. يمكن أن يكون بعض الأعضاء غير قادرين على الاتصال ..

وعندما يدخلون الى المنتدى يمكنهم تحميل مثل هذه الأسئلة .. وحلها بدون اتصال ثم (عندما يستطيعون الاتصال ) يضعون حلولهم ...

وحتى لو لم يكن هناك اقبال ابدا .. فسوف يكون في المنتدى مخزون رائع من الأسئلة .. ربما يقتتحون قسم الأسئلة الشنقيطية .. laugh.gif

أسأل الله أن يكون هذا في ميزان حسناتك ...

على العموم ...

لقد أنهيت حلّي فأين أضعه ... ؟

بانتظارك

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 28 يونيو 2012 في 12:31

#5
اقتباس
لقد أنهيت حلّي فأين أضعه ... ؟

أرسله لي على الخاص :)

أخبرني إذا كانت الرسائل الشخصية معطلة لديك.

#6

حتى الآن لم تصلني أية محاولة !!, هل السؤال صعب لهذه الدرجة ؟؟

#7

ألم تصلك محاولتي من الساعة 3 أرسلتها ... ألم تصلك ؟؟

أستاذ أحمد ... هناك خطأ ما يحدث فيتم تحويل الرسالة إلى حساب آخر ...

على أي حال يبدو أنه لن يجيب أحد هل أضع محاولتي هنا ؟؟

انظر إلى تشخيص هذا الخطأ في المنتدى ...

وهذه صورة للرسالة (حتى لا يطول تجميل الصفحة سأضع رابط الصورة بدل وضع الصورة )

عجباً ... ما الذي يحدث للمنتدى !! انظر أخي ماذا وجدت عندما فتحت ملفك الشخصي :

http://store2.up-00.com/June12/PSj14183.png

أنتظر ردك بشأن وضع الحل ..

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 28 يونيو 2012 في 23:13

#8

مرحبا أخي مصطفى :)

الرسالة التي أرسلتَها لم تصلني لأنك لم تُرسلها لي :)

post-219439-023125600 1340914652_thumb.p

اسمي أحمد و ليس محمد :)

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

يمكننا مراسلة الإدارة لحل هذه المشكلة :)

المرفقات
Dsd13563.png
#9

تم استقبال محاولة الأخ مصطفى.

بانتظار بقية المحاولات :)

#10

محاولة الأخ مصطفى تصلح لــ n<=3 فقط !

للتبسيط, نفترض مؤقتا أن n=4, المطلوب هو إظهار الأعداد التتابعة المُكونة من 4 أرقام.

بالتوفيق.

#11
أحمد الشنقيطي كتب:

محاولة الأخ مصطفى تصلح لــ n<=3 فقط !

للتبسيط, نفترض مؤقتا أن n=4, المطلوب هو إظهار الأعداد التتابعة المُكونة من 4 أرقام.

بالتوفيق.

أهلا أخ شنقيطي

أنى أرى أنه من الأفضل ترك n غير محددة أو بمعنى أصح نترك للمستخدم حرية إدخال ما يشاء من الأعداد wink.gif

i love you mama

#12

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

بداية, سأعطي تلميحات عن الفكرة ..

للتبسيط, سنفترض أن المستخدم سيُدخل عدد صحيح موجب و البرنامج يُظهر رسالة تفيد بأن العدد المُدخل تتابعي أو لا !

أول شيء سنحتاج إلى تحويل العدد المُدخل إلى مصفوفة حرفية, يمكننا فعل ذلك هكذا :

#include <sstream>
#include <iostream>
#include <cstdlib>
int main()
{
    int i;
    std::cin>>i;
    std::ostringstream os;
    os << i;
    std::string str = os.str();
    system("cls");
    std::cout <<"Your number is : "<< str<< std::endl;
    std::cout <<"Number of digits = "<< str.length()<< std::endl;
}

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

انظر المثال :

#include <iostream>
using namespace std;
int main()
{
	 int n = 197, T[4] = {1,9,7};
	 for(;;) {
	    T[3] = T[0] + T[1] + T[2];
	    T[0] = T[1];
	    T[1] = T[2];
	    T[2] = T[3];
	    if(T[3] == n){
	       cout<<"It's Okay ;)"<<endl;
	       break;
	    }
	    if(T[3] > n){
	       cout<<"It's Not Okay :("<<endl;
	       break;
	    }
	 }
	 return 0;
}

يمكننا تطوير المثال لكي يتعامل مع الأعداد التتابعية ذات n رقم.

بالتوفيق.

2
#13

السلام عليكم

تفضل أخى الكريم محاولتى بلغة C ولكن مكتوبة فى بيئة ++c فلم أراعى أن يكون الكود قياسى للغة C وبالتالى سيكون هناك أخطاء إذا تم التنفيذ على مترجم للغة السي .

وهذا هو الكود لأى عدد مكون من n منزلة فى حدود مدى الأعداد الصحيحة int

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void digitNumbers( int Num,int *pChar);
int numOfCells(int Num);
int main(void){
	int Num=0,sum=0,*pSum=NULL,*pNum=NULL,i=0;
	bool isT=false;
	printf("Please enter number:\n");
	scanf("%d",&Num);
	pNum=(int *)malloc(sizeof(int)*(numOfCells(Num)-1));
	digitNumbers(Num,pNum);
	pSum=(int *)malloc(sizeof(int)*(numOfCells(Num)-1));
	for(i=numOfCells(Num)-1;i>=0;i--){
            	*(pSum+i)=*(pNum+i);
    	}
	while(sum<=Num){
    	sum=0;
    	for(i=numOfCells(Num)-1;i>=0;i--){
            	sum+=*(pSum+i);
    	}
    	for(i=numOfCells(Num)-1;i>=0;i--){
        	if(i==0)	
            	printf("%d=%d",*(pSum+i),sum);
        	else
            	printf("%d+",*(pSum+i));
    	}
    	printf("\n");
    	if(sum==Num){ isT=true; break; };
    	for(i=numOfCells(Num)-1;i>=0;i--){
        	if(i==0) 
         	*(pSum+i)=sum;
        	else
         	*(pSum+i)=*(pSum+i-1);
    	}
	}
	if(isT==true) 
    	printf("Sequential number.\n");
	else
    	printf("Not sequential number.\n");
	free(pNum);
	free(pSum);
return 0;
}

// تقسيم العدد لمنازلة وحفظهم فى مؤشر 
void digitNumbers( int Num,int *pChar){
	int intNum=0;
   	for( int i=0;i<numOfCells(Num);i++)
    	{
            	intNum=Num/pow(10,i);
            	*(pChar+i)=intNum%10;
    	}
}

// دالة لحساب عدد منازل الرقم
int numOfCells(int Num){
	int NumberOfDigit=0;
  	while(Num/10 >= 1)
     	{
    	Num=Num/10;
    	NumberOfDigit++;
     	}
	return ++NumberOfDigit;
}
2

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#14

بارك الله فيك أخي أحمد, بالفعل .. محاولة رائعة :)

سأدقق النظر فيها لاحقا.

أنا أيضا كتبتُ محاولتي بالعجوز السي :D :

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

void Chiffres(int x, int* T) {
    int i = 0;
    while (x != 0) {
        T[i++] = x % 10;
        x = x / 10;
    }
}

int Somme(int* T, int n) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s += T;
    }
    return s;
}

void inverse(int tableau[], int tailleTableau) {
    int i = 0, temp = 0;

    for (i = 0; i < tailleTableau / 2; i++) {
        temp = tableau;
        tableau = tableau[tailleTableau - i - 1];
        tableau[tailleTableau - i - 1] = temp;
    }
}

void ShiftGauche(int* T, int n, int k) {
    int i, j;
    for (i = 1; i <= k; i++)
        for (j = 0; j < n - 1; j++)
            T[j] = T[j + 1];
}

int main(int argc, char** argv) {
    int n, size, S;
    scanf("%d", &n);
    size = (int) log10((float) n) + 1;
    int *T = (int*) malloc(size * sizeof (int));
    Chiffres(n, T);
    inverse(T, size);
    S = Somme(T, size);
    while (S < n) {
        ShiftGauche(T, size, 1);
        T[size - 1] = S;
        S = Somme(T, size);
        printf("%d, ",S);
    }
    if (S == n)
        printf("\b\b. It's Okay ;)\n");
    else
        printf("\b\b. It's Not Okay :(\n");
    free(T);
    return 0;
}

قمتُ بتقسيم الكود إلى 4 دوال, هن على الترتيب :

Chiffres : تأخذ وسيطين, الأول عبارة عن العدد المُراد تفكيك أرقامه و الثاني هو الجدول الذي سيتم فيه تخزين أرقام العدد.

Somme : تأخذ وسيطين : مصفوفة عددية و عدد عناصرها و تعيد متغير صحيح يحتوي على مجموع قيم المصفوفة.

inverse : تستقبل معاملين : اسم المصفوفة و عدد عناصرها ثم تقوم بقلب ترتيب العناصر.

ShiftGauche : : تأخذ 3 وسائط : مصفوفة عددية, عدد عناصرها و مقدار الإزاحة ثم تزيح المصفوفة T بمقدرا k خانة إلى اليمين.

الدالة الرئيسية main :

  • في البداية نطلب من المستخدم إدخال عدد صحيح ثم نحسب عدد أرقامه و نخزن الناتج في المتغير size ثم ننشئ مصفوفة ديناميكية بطول size.
  • نضع أرقام العدد n في المصفوفة T ثم نقوم بقلب ترتيب العناصر قبل أن نضع ناتج جمع الأرقام في المتغير S.
  • ما دام المتغير S أقل تماما من العدد المُدخل, نقوم بإزاجة عناصر المصفوفة بخانة واحدة إلى اليمين ثم نحسب مجموع الأرقام من جديد.
  • عند الخروج من الحلقة, إذا كانت قيمة S مُساوية لقيمة العدد المُدخل فهذا يعني أن العدد تتابعي و إلا فالعكس.

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

post-219439-078556100 1341012837_thumb.p

بالتوفيق.

المرفقات
test.png

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 30 يونيو 2012 في 02:40

3
#15

السلام عليكم

كود رائعة أخى محمد وبه أفكار جميلة .

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

دمتم بود

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#16
اقتباس
كود رائع أخى محمد وبه أفكار جميلة

أخوك أحمد :)

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

لسوء الحظ, السي و السي++ لا يدعمان الــ BigInteger !, على عكس الــ Java :)

هذه خربشات كتبتُها بالجافا :D حيث أصبح الكود يدعم جميع الأعداد التتابعية الموجودة في الجدول السابق و أكثر .. :

import java.io.*;
import java.math.BigInteger;

public class SequentialNumber {

    static BigInteger T[];

    static void init_T(BigInteger n) {
        BigInteger Dix = new BigInteger("10");
        for (int i = T.length - 1; i >= 0; i--) {
            T = n.remainder(Dix);
            n = n.divide(Dix);
        }
    }

    static BigInteger Next_Somme() {
        BigInteger s = new BigInteger("0");
        for (int i = 0; i < T.length - 1; i++) {
            s = s.add(T);
            T = T[i + 1];
        }
        s = s.add(T[T.length - 1]);
        T[T.length - 1] = s;
        return s;
    }

    public static void main(String[] args) throws IOException {
        System.out.println("Please enter number : ");
        String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
        BigInteger n = new BigInteger(str);
        T = new BigInteger[str.length()];
        init_T(n);
        BigInteger Somme = new BigInteger("0");
        while (Somme.compareTo(n) == - 1) {
            Somme = Next_Somme();
        }
        if (n.equals(Somme)) {
            System.out.println("It's Okay ;)");
        } else {
            System.out.println("It's Not Okay :(");
        }
    }
}

مُخرجات الكود : (في المُرفقات).

عودا على بدء, لا ننسى أن السؤال الأصلي للموضوع هو :

اقتباس
اكتب برنامج بالسي أو السي++ يطلب من المستخدم إدخال عدد صحيح n, ثم يُظهر له جميع الأعداد التتابعية المُكونة من n رقم.

إذا, المُستخدم الآن سيُدخل عدد أرقام العدد بدلا من العدد نفسه.

بانتظار أرائكم و أفكاركم :happy:

post-219439-061705500 1341082114_thumb.p

post-219439-053808500 1341082454_thumb.p

المرفقات
It's Okay.pngNot Okay.png
3
#17

السلام عليكم

اقتباس
أخوك أحمد smile.gif
عذراً على الخطأ , تشرفنا بك أخى أحمد
اقتباس
لسوء الحظ, السي و السي++ لا يدعمان الــ BigInteger !, على عكس الــ Java smile.gif
ونحن لم نستخدم إلا متغير من نوع int فهناك متغيرات أكبر كــ unsigned long long int والذى تبلغ عدد خانات الرقم به تقريباً 20 خانة - على ما أظن - , وحتى هذا النوع لا يصلح للرقم الكبير الذى إستخدمته أنت فى برنامجك الذى كتبته بالـ java , ولكن ربما يوجد classes للغة ++C أيضاً كــ java.math.BigInteger فى لغة الـ java .

اقتباس
إذا, المُستخدم الآن سيُدخل عدد أرقام العدد بدلا من العدد نفسه.
تقصد يدخل المستخدم عدد n "خانات أو منازل الرقم" ويقوم البرنامج بحساب جميع الأعداد التتابعية التى تتألف من هذا العدد من الخانات أو المنازل .

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#18
اقتباس
تشرفنا بك أخى أحمد

الشرف لي أنا :)

اقتباس
ونحن لم نستخدم إلا متغير من نوع int فهناك متغيرات أكبر كــ unsigned long long int والذى تبلغ عدد خانات الرقم به تقريباً 20 خانة - على ما أظن - , وحتى هذا النوع لا يصلح للرقم الكبير الذى إستخدمته أنت فى برنامجك الذى كتبته بالـ java , ولكن ربما يوجد classes للغة ++C أيضاً كــ java.math.BigInteger فى لغة الـ java .

نعم, القيمة العُظمى للنوع unsigned long long int حسب المعيار C99 هي :

MAXVALUE(unsigned long long int) = 2^64 - 1 = 18 446 744 073 709 551 615 //64 bits
MAXVALUE(unsigned long long int) = 2^32 - 1 = 4 294 967 295 //32 bits

لكن إن أردنا التعامل مع الــ BigInteger في السي/السي++ فيجب أن نستخدم إحدى المكتبتين :

GMP (GNU Multiple Precision Arithmetic Library)

MIRACL (Multiprecision Integer and Rational Arithmetic C/C++ Library)

و هذا ما لا أريده حاليا ! :sleep:

عموما, لو أردنا حل السؤال بطريقة "تقليدية" فسيكون الجواب هكذا :

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

void Chiffres(int x, int* T) {
    int i = 0;
    while (x != 0) {
        T[i++] = x % 10;
        x = x / 10;
    }
}

int Somme(int* T, int n) {
    int s = 0;
    for (int i = 0; i < n; i++) {
        s += T;
    }
    return s;
}

void inverse(int tableau[], int tailleTableau) {
    int i = 0, temp = 0;

    for (i = 0; i < tailleTableau / 2; i++) {
        temp = tableau;
        tableau = tableau[tailleTableau - i - 1];
        tableau[tailleTableau - i - 1] = temp;
    }
}

void ShiftGauche(int* T, int n, int k) {
    int i, j;
    for (i = 1; i <= k; i++)
        for (j = 0; j < n - 1; j++)
            T[j] = T[j + 1];
}

int main(int argc, char** argv) {
    int size;
    unsigned long long int n, S;
    printf("Entrez le nombre de chiffres : ");
    scanf("%d",&size);
    int *T = (int*) malloc(size * sizeof (int));
    printf("\nVoici les nombres sequentiels de %d chiffres :\n",size);
    for(int i = (int)pow(10,size - 1);i <= (int)pow(10,size) - 1;i++){
        n = i;
        Chiffres(n, T);
        inverse(T, size);
        S = Somme(T, size);
        while (S < n) {
            ShiftGauche(T, size, 1);
            T[size - 1] = S;
            S = Somme(T, size);
        }
        if (S == n)
            printf("%llu, ",S);
    }
    puts("Fin !");
    free(T);
    return 0;
}

حتى لا تُسببوا إحراج للـكـود, أرجو أن يكون عدد الأرقام أقل أو يُساوي 8 :D

بانتظار جديدكم :happy:

1
#19

ما شاء الله ... ما شاء الله ...

تركت المنتدى يومين ... فتجاوزتم حدود الاحتراف ..؟ ماذا لو انتظرت أسبوعاً هل ستصلون للقمر laugh.gif......

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

جزاك الله خيرا أستاذ أحمد ... وشكرا جزيلا للأخ العزيز أحمد على هذا الإبداع ...(يبدو أنك أصبحت من أصدقاء ++C أخيرا laugh.gif)

سأدرس الأكواد بنهم ... بما أنه فاتتني فرصة الحل ... (في الحقيقة فكرت كثيرا ... لكن يبدو أنني كنت أفكر بالطريقة الخطأ wacko.gif)

على فكرة يمكنك أستاذ أحمد (ش) أن ترى أنني كنت قريبا من الإجابة الصحيحة .. ولكنني كنت مستعجلا أثناء حل المسألة ...

من المضحك في البرمجة أنك تكتب كوداً وتظن أنه يعمل ... وبالفعل يعمل كما تريد ...

وعندما تنقحه جيدا تكتشف وجود الكثير من الأخطاء بحيث أنه يجب أن يعطيك نتائج خاطئة ... على عكس ما يفعل laugh.gif

أن يعطيك البرنامج نتائج خاطئة... أفضل مئة مرة من أن يعطيك نتائج صحيحة وهو مليء بالأخطاءlaugh.gif

على أي حال هذه محاولتي (الفاشلةwacko.gif)

ولقد اكتشفت الخطأ (الفعل إنه خطأ مضحك جدا جدا جدا laugh.giflaugh.giflaugh.gif)

كنت أستخدم متغيرات من نوع char والتي مداها الأعظمي 127 في حالة signed

بينما يستخدم السادة هنا unsigned long long int يا لي من أبله36_11_16[1].gif110103_pick_prv.gif

إليكم المحاولة (والتي لن يقرأها أحد 200.gif)

#include<iostream>
using namespace std;
#define OneDigitNumber char
unsigned int Integer(OneDigitNumber*Number,short size)
{
	unsigned int result=0;
	for(int i=0;i<size;i++)
	{
		result+=Number;
		result*=10;
	}
	result/=10;
	return result;
}
void ShiftNumberLeft(OneDigitNumber*Number,short size)
{
	for(int i=0;i<size-1;i++)
	{
		Number=Number[i+1];
	}
	Number[size-1]=0;
}
void OneDigitNumberConverter(unsigned int number,OneDigitNumber*Number,short size)
{
	for(int i=size-1;i>=0;i--)
	{
		Number=number%10;
		number/=10;
	}
}
int main()
{
OneDigitNumber *Number;
cout<<"Enter n\n";
short n;
cin>>n;
Number=new OneDigitNumber[n];
Number[0]=1;
for(int i=1;i<n;i++)
{
	Number=0;
}
unsigned int sum=0;
for(unsigned int number=Integer(Number,n),Max=number*10;number<Max;)
{
	sum=0;
for(int j=0;j<n;j++)
{
	sum+=Number[j];
}
if(sum==number)
{
	cout<<"It's Sequentially number !!\t"<<number<<endl;
	number++;
	OneDigitNumberConverter(number,Number,n);
}
else if(sum>number)
{
	number++;
	OneDigitNumberConverter(number,Number,n);
}
else 
{
	cout<<number<<'\r';
	ShiftNumberLeft(Number,n);
	Number[n-1]=sum;
}
}
return 0;
}

ورغم انتهاء مدة التسليم ... قإنني سأسعى لتحسين الكود ... وسأضعه بعد انتهائي ...

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

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 1 يوليو 2012 في 10:41

#20

لقد صححت الكود وذلك بتغيير كلمة واحدة فقط لا غير .... في السطر الثاني بدل char كتبت unsigned int

#include<iostream>
using namespace std;
#define OneDigitNumber unsigned int
unsigned int Integer(OneDigitNumber*Number,short size)
{
    	unsigned int result=0;
    	for(int i=0;i<size;i++)
    	{
            	result+=Number;
            	result*=10;
    	}
    	result/=10;
    	return result;
}
void ShiftNumberLeft(OneDigitNumber*Number,short size)
{
    	for(int i=0;i<size-1;i++)
    	{
            	Number=Number[i+1];
    	}
    	Number[size-1]=0;
}
void OneDigitNumberConverter(unsigned int number,OneDigitNumber*Number,short size)
{
    	for(int i=size-1;i>=0;i--)
    	{
            	Number=number%10;
            	number/=10;
    	}
}
int main()
{
OneDigitNumber *Number;
cout<<"Enter n\n";
short n;
cin>>n;
Number=new OneDigitNumber[n];
Number[0]=1;
for(int i=1;i<n;i++)
{
    	Number=0;
}
unsigned int sum=0;
for(unsigned int number=Integer(Number,n),Max=number*10;number<Max;)
{
    	sum=0;
for(int j=0;j<n;j++)
{
    	sum+=Number[j];
}
if(sum==number)
{
    	cout<<"It's Sequentially number !!\t"<<number<<endl;
    	number++;
    	OneDigitNumberConverter(number,Number,n);
}
else if(sum>number)
{
    	number++;
    	OneDigitNumberConverter(number,Number,n);
}
else 
{
    	cout<<number<<'\r';
    	ShiftNumberLeft(Number,n);
    	Number[n-1]=sum;
}
}
return 0;
}

ملاحظة الخوارزمية ليست بطيئة ... ولكن عمليةالإخراج هي البطيئة وبإضافة حرفين للكود فقط وهما //

سيصبح الكود سريعا ويعمل كما تريدون ... cool.gif

#include<iostream>
using namespace std;
#define OneDigitNumber unsigned int
unsigned int Integer(OneDigitNumber*Number,short size)
{
    	unsigned int result=0;
    	for(int i=0;i<size;i++)
    	{
            	result+=Number;
            	result*=10;
    	}
    	result/=10;
    	return result;
}
void ShiftNumberLeft(OneDigitNumber*Number,short size)
{
    	for(int i=0;i<size-1;i++)
    	{
            	Number=Number[i+1];
    	}
    	Number[size-1]=0;
}
void OneDigitNumberConverter(unsigned int number,OneDigitNumber*Number,short size)
{
    	for(int i=size-1;i>=0;i--)
    	{
            	Number=number%10;
            	number/=10;
    	}
}
int main()
{
OneDigitNumber *Number;
cout<<"Enter n\n";
short n;
cin>>n;
Number=new OneDigitNumber[n];
Number[0]=1;
for(int i=1;i<n;i++)
{
    	Number=0;
}
unsigned int sum=0;
for(unsigned int number=Integer(Number,n),Max=number*10;number<Max;)
{
    	sum=0;
for(int j=0;j<n;j++)
{
    	sum+=Number[j];
}
if(sum==number)
{
    	cout<<"It's Sequentially number !!\t"<<number<<endl;
    	number++;
    	OneDigitNumberConverter(number,Number,n);
}
else if(sum>number)
{
    	number++;
    	OneDigitNumberConverter(number,Number,n);
}
else 
{
//    	cout<<number<<'\r';
    	ShiftNumberLeft(Number,n);
    	Number[n-1]=sum;
}
}
return 0;
}

الحمد لله .. الذي فهمني وعلمني هذا من فضل ربي ...

الآن أنا مستعد للتحدي من جديد ... 044.gif

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

#21

السلام عليكم

أخي مصطفى, بدلا من أتضع 3 أكواد لا تؤدي المطلوب .. أرى أنه لو اكتفيتَ بإرفاق آخر نسخة من محاولتك لكان أفضل.

اقتباس
ملاحظة الخوارزمية ليست بطيئة ... ولكن عمليةالإخراج هي البطيئة وبإضافة حرفين للكود فقط وهما //

سيصبح الكود سريعا ويعمل كما تريدون ...

ليس إلى تلك الدرجة :)

إذا جربنا الكود مع 9 أرقام سننتظر .. 24 ساعة .. قبل ظهور النتائج ! و هذا ما يجب أن نتفاداه :cool:

بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 1 يوليو 2012 في 11:10

#22

بالنسبة لوضع الأكواد التي لا تؤدي المطلوب .. فالمطلوب من وضع الأكواد هو تبرير إخفاقي ... على كل حال أعتذر عن ذلك ... smile.gif

أما بالنسبة لسرعته فوق 7 منازل ... معك حق ... ولكن هذا آخر ما وصلت إليه .. حتى الآن ...

أريد سؤالك أستاذي ... هل البرنامج الذي كتبته (خربشتهlaugh.gif)بجافا .. يقوم بالمطلوب وبسرعة ... (وأعني هل انتهت إجابة السؤال ووصلنا إلى المطلوب ؟؟ )

وشكرا لك ..(أكرر اعتذاري علىالأكواد الفاشلة ... إن أردت حذفها فلك حرية ذلك )

#23
اقتباس
هل البرنامج الذي كتبته (خربشته :lol: ) بجافا .. يقوم بالمطلوب وبسرعة

نعم, يؤدي المطلوب و أكثر, لاحظ أن الوقت المُستغرق كان يتراوح بين 4 و 8 ثوان :happy:

اقتباس
هل انتهت إجابة السؤال ووصلنا إلى المطلوب ؟؟

انتهت الإجابة بالجافا و لكن لم تنتهي بالسي/السي++ :D

بالتوفيق.

#24

عدلت على كودك أخ شنقيطي حتى نترك للمستخدم إدخال ماشاء من الأعداد n

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20

int main()
{
int i=0,c=0,n=0; long  T[MAX]={0} ;char a[MAX]={0};
printf("entrer nombre:\t");      	scanf("%s",a);
c=atol(a);                         	n=strlen(a);
for(;i<n;i++)              	T=(long)a-'0';

    	for(;;) {
            	for(i;i<n ;i++)  T[n] += T ;
            	for(i=0;i<n;i++) T = T[i+1];
            	if(T[n] == c){
            	printf("It's Okay ;");
            	break;
            	}
            	if(T[n] > c){
            	printf("It's Not Okay;");
            	break;
            	}
            	T[n]=0;
    	}
    	return 0;
}

هكذا كان كودي في البداية

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000


int main()
{

long s[MAX]={0};int t[MAX]={0},a=0,i=0,j=0,k=0,n=0;char buffer [MAX];

void condition(long s)
{
	if(s==a){printf("oui\n"); exit(0);}
	else if (s>a) {printf("non\n"); exit(0);}
}

printf("enter nombre:\t"); scanf("%d",&a);
itoa (a,buffer,10) ; 	n=strlen(buffer);


for(;i<n;i++)
t=(int) buffer-'0';


for(i=0;i<n;i++)
{s[0]+=(long)t; condition(s[0]);}

for(i=1;i<n+1;i++)
{s=2*s[i-1]-t[i-1]; condition(s);}


for(k=0,i=n+1;;k++,i++)
for(j=n+k;j>k;j--)
{s+=s[j]; condition(s);}

	return 0;
}

المشكلة في الكودين هو أنهما لا يقبلان أعداد كبيرة لا ندري هل هناك حل لهذه المشكلة باستعمال مكتبة gmp

يشتغل بشكل صحيح عند 9 أرقام الأولى وبعد دلك لا يشتغل الكود

وبالتوفيق للجيمع

تم تعديل هذه المشاركة بواسطة مومو (momo) في 1 يوليو 2012 في 14:35

i love you mama

#25
اقتباس
عدلت على كودك أخ شنقيطي حتى نترك للمستخدم إدخال ماشاء من الأعداد n

جميل, و لكن المطلوب الآن هو إدخال عدد الأرقام بدلا من العدد نفسه :)

اقتباس
هكذا كان كودي في البداية

الكود يحتوي على أخطاء أثناء الترجمة, يمكنك مراجعته.

اقتباس
المشكلة في الكودين هو أنهما لا يقبلان أعداد كبيرة لا ندري هل هناك حل لهذه المشكلة باستعمال مكتبة gmp

يشتغل بشكل صحيح عند 9 أرقام الأولى وبعد دلك لا يشتغل الكود

سبق و أن كتب الأستاذ خالد الشايع عن موضوع الــ BigInteger في السي++ اعتمادا على المكتبة MAPM :

الأعداد العملاقة في ++c بمنتهى السهولة !!

بالتوفيق.

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

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

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

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

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