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

مشكلة في سؤال رياضي

مغلق
بدأه علاء السلال في 25 ديسمبر 2005 · 13 رد · 2,316 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أحاول حل هذا السؤال :

اقتباس
For every positive integer x we define A(x) to be the integer whose digits are those of x in ascending order, and similarly D(x) but in descending order. For example A(2959) = 2599 and D(2959) = 9952. Find all 4-digit integers x such that D(x) – A(x) = x.

لذلك كتبت هذا الكود في C++

#include <iostream.h>
void main ()
{
	int num; int i;
	int maxd1 = 0 , maxd2 = 0 , maxd3 = 0 , maxd4 = 0;
	int numArr[4];
	int desNum;
	int ascNum;
	int d1;
	int digit;
	int subTest;



	for ( num = 1000; num < 10000; num ++ )
	{
  int num2 = num;
  for ( i = 1; i <= 4; ++i )
  {
  	d1 = num2 /10;
  	digit = num2 - d1*10;
  	numArr  = digit;
  	num2 = d1;

  	//

  	if ( numArr >= maxd1 )
  	{
    maxd4 = maxd3;
    maxd3 = maxd2;
    maxd3 = maxd2;
    maxd2 = maxd1;
    maxd1 = numArr;
  	}
  	else if (numArr >= maxd2)
  	{
    maxd4 = maxd3;
    maxd3 = maxd2;
    maxd3 = maxd2;
    maxd2 = numArr;
  	}
  	else if  (numArr >= maxd3)
  	{
    maxd4 = maxd3;
    maxd3 = numArr;
  	}
  	else 
    maxd4 = numArr;
  }
  desNum = maxd1 * 1000 + maxd2 * 100 + maxd3 * 10 + maxd4;
  ascNum = maxd4 * 1000 + maxd3 * 100 + maxd2 * 10 + maxd1;

  subTest = desNum - ascNum;
  cout << subTest;

  if ( subTest = num )
  {
  	cout << num;
  }
	}
} // coded by ala'

قمت بترجمة الكود وتشغيل البرنامج..

لكن للأسف لم تظهر أي نتيجة :(

أرجو المساعدة،

تم تعديل هذه المشاركة بواسطة ala101 في 25 ديسمبر 2005 في 14:55

اللهم طهر أرض فلسطين من العملاء والخونة

#2

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

أنا مش فاهم المسئلة عاوزة أية ولكن علشان تحل مشكلة أختفاء الشاشة السوداء

أعمل include لconio Header file كما يلى وف أخر الmain قبل قفل قوس الmain أكتب getch();

#include <conio>
//before closing main wirte getch();
.
.
.
getch();
//Get char from keyboard but not appear at console app

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#3

أهلاً أخي العزيز eng_3llam

المشكلة ليست في اختفاء الشاشة السوداء..

لو كانت هذه هي المشكلة فإنه يمكن حله بكتابة هذا السطر مثلاً

cin >> x ;

بسهولة..

المشكلة هي أن الكود تتم ترجمته في لغة C++ ولكن عند تشغيله لا تظهر النتائج المطلوبة كما هو موضح في السؤال أعلاه..

لذلك أعتقد أنني أخطأت في مكان ما في الكود..

أتمنى أن يكتشف أحد الأخوة خطأي ويصححه لي..

وشكراً على مروركم الطيب،:)

اللهم طهر أرض فلسطين من العملاء والخونة

#4

الاحظ في شوية تعقيد للأمور ..

علشان ترتب الـ array تحتاج ان تستخدم خوارزمية للترتيب مثل bubble sort او ما شابه, و هذه الأفضل ان تضعها في function منفصل حتى تسهل عليك البرمجة.

بعدين لاحظت عندك خطأ تقريبا قاتل:

 if ( subTest = num )
 {
  cout << num;
 }

لاحظ = داخل الـ if .. المفروض تكون == لأن ذلك يغير المعنى تماما!!

 if ( subTest == num )
 {
  cout << num;
 }

و عندك الـ loop انت تعد من 1 الى 4 و هذا غلط, لازم تعد من 0 الى 3

 for ( i = 0; i <= 3; ++i )

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 25 ديسمبر 2005 في 17:19

#5

ممم ممكن تأخد الرقم من المستخدم ف pointer to char وتجيب طولة عن طريق strlen وبعد كدة

ترمى الarray of char الى دالة بها لووب تمشى ع الarray وتقارن أول element ف الarray بثانى element حيث عند

المقارنة يجب عليك تحويلة الى int عن طريق دالة تسمى atoi وأذا كان أكبر يضعة ف array of int وحجمها بحجم الarray of char

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

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#6

للفائدة إذا كنت تحتاج فنكشن يقوم بعـملية ترتيب للدالة من الأصغر إلى الأكبر

فاستخدم الدالة sort التي تستقبل بارامترين اثنين .. الأول اسم المصفوفة والثاني عـدد عـناصرها ...

هذه الدالة موجودة في المكتبة algorithm ...

لا تنسى تضمين هذا التوجيه

using std::sort
#7

شكراً على مروركم وردودكم الطيبة، وجزاكم الله كل الخير،

أخي حسن،

قمت بتصحيح الأخطاء في الكود والكود بعد التعديل في المرفقات

لكنه لا يظهر النتائج المرجوة بعد :(

أخي eng_3llam لم أفهم طريقتك بالضبط.. أعذرك لانشغالك :)

أخي سلطان،

هل الدالة sort تستطيع ترتيب رقم مكون من 4 منازل مرة تصاعدياً ومرة تنازلياً ؟

لماذا البرنامج لا يعمل بطريقة صحيحة حتى الآن مع أني قمت بتعديل الأخطاء التي اكتشفها أخي حسن؟

عند تنفيذ الكود المرفق تظهر النتيجة : 4995

وهذه النتيجة خاطئة لأن 9954 - 4599 <> 4995

Cpp1.rar

تم تعديل هذه المشاركة بواسطة ala101 في 25 ديسمبر 2005 في 19:07

اللهم طهر أرض فلسطين من العملاء والخونة

#8

السلام عليكم

كلام الاخ Eng_3llam مظبوط كل ما عليك هو ان تاخذ الرقم من المستخدم تحوله إلى مصفوفة من الاحرف, ترتب الاحرف مرة تصاعدى ومرة تنازلى, بعد الترتيب تحول المصفوفة إلى رقم, بهذا الطريقة تحصل على A(x) , و D(x), والان يمكنك عمل عملية الطرح ومقارنة الاعداد..

لتحويل الرقم إلى مصفوفة محارف يمكنك إستخدام itoa ولتحويل مصفوفة المحارف إلى ارقام يمكنك ان تستخدم atoi..

لترتيب المصفوفة يمكنك إستخدام طريقة الاخ سلطان ...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#9

آسف الطريقة التي وضعتها خاطئـة .. عفواً لأن ذاكرتي ضعيفـة قليلاً ...

البارامتر الثاني ليس عـدد عـناصر المصفوفة أو الحاوية بل آخر عـنصر في المصفوفة أو الحاوية ؛ أنظر إلى هذا المثال البسيط:

int arr [10];
sort (arr , arr+10 );

بالنسبة لسؤالك حـول إمكانية ترتيبها تنازلياً (من الأكبر إلى الأصغر ) فيوجد دالة أخرى تقوم بذلك .. حاولت أن أتذكرها أو أبحث عـنها فلم أجدها لا في عقلي ولا في كتبي .. لكنها موجودة ..

على العـموم الأمر سيصبح الأمر بسيطاً ما دام أن المصفوفة أصبحت مرتبة تصاعـدياً ... قم بعكسها فقط ... أكتب قالباً (دالة) template function يقوم بهذا العـمل

#10

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

السلام عليكم

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

#include <iostream>
#include <conio>
#include <ctype.h>
#include <stdlib>

int ConvertToInt(char* ch1 = 0 )  //To convert char to int
{ return  atoi(ch1); }

//This mehtod take array of char and size and convert it to array of int
//from this mehtod u can call ur sorting mehtod to sort the array of integer
void Sort(char* ptr , unsigned int size)
{
 int count = 0;
 int* arr = new int [0];

 for(int i = 0; i < size; i++)
  if( isdigit(ptr) )
  {
   char c = ptr;
   arr[count++] = ConvertToInt(&c);

  }



  for(int i = 0; i < count; i++)
   cout<<arr<<"  ";

}

void main()                           //Entry point
{
 char* ptr = new char[4];
 cout<<"enter ur numbers";
 for(int i = 0; i < 4; i++)
  cin>>ptr;
 Sort(ptr , 4);
 getch();
}

أدعوا لى بالتوفيق عندى أمتحان logic desgin بكرة  :s

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11
public static void main(String[] args) {
  for(int i=0;i<100000;i++){
 	 int x=getSpecialAlaaValue(i);
 	 if(x==i)System.out.println(i+"\t"+x+"\tYES");
 	 
  }

	}
	public static int getSpecialAlaaValue(int x){
  String number=x+"";
  char[]numbers=number.toCharArray();
  Arrays.sort(numbers);
  StringBuilder b=new StringBuilder(new String(numbers));
  int smallNumber=Integer.parseInt(b.toString());
  int bigNumber=Integer.parseInt(b.reverse().toString());
  return bigNumber-smallNumber;
  
	}

والأجوبة:

0	0	YES
495	495	YES
6174	6174	YES
#12

يا سلام!!!!!!!!

:D

جزاكم الله كل الخير أخي أبو مازن ،

فعلاً الجواب صحيح 100%

شكراً جزيلاً .. فهذا السؤال أرقني كثيراً

:)

هذا مصدر السؤال :

MATH QUIZ CHALLENGE -- MARCH 2005

تم تعديل هذه المشاركة بواسطة ala101 في 16 مارس 2006 في 18:50

اللهم طهر أرض فلسطين من العملاء والخونة

#13

لو أدري وضعت الحل منذ زمن!!

لكن السؤال في الصفحة لا يطلب الجواب بل يطلب التحليل الرياضي أليس كذلك؟

#14

بالضبط .. السؤال يطلب إثباتاً رياضياً Proof

لكنني لم أتمكن من الوصول إلى برهان رياضي يثبت النتيجة ..

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

:)

اللهم طهر أرض فلسطين من العملاء والخونة

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

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