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

سوال حول !n فی ProjectEuler

مغلق
بدأه C77431 في 4 يناير 2011 · 10 رد · 1,258 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام علیکم و رحمة الله و برکاته...

الیوم واجهت بسوال و قمت بحله. و لکن لا أعلم أین الخطأ...

السوال: (منقول من موقع Project Euler )

اقتباس

n! means n * (n - 1) * ... *3*2*1

Find the sum of the digits in the number 100!

و هذا جوابی:

 

void problem20 ()
{
 int sum=0;
 int number;
 int number_digit;
 for (int i=1; i<=100; i++)
 {
  number=i;
  number_digit=0;
  while(number!=0)
  {
   number_digit+=number%10;
   number=number/10;
  }
  sum+=number_digit;

 }
 cout<<"\nsum is: "<<sum;
 system("pause");
}

شکرا لکم جزیلا...

#2

اخي الكريم ينقصك تعريف ملفات الــ .h والدالة main اليك التعديل:

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

void problem20();
//------------------------
void main()
{
 problem20();
}
//-----------------------
void problem20 ()
{
 int sum=0;
 int number;
 int number_digit;
 for (int i=1; i<=100; i++)
 {
  number=i;
  number_digit=0;
  while(number!=0)
  {
   number_digit+=number%10;
   number=number/10;
  }
  sum+=number_digit;

 }
 cout<<"\nsum is: "<<sum;
 system("pause");
}
#3

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

ربما الخطأ هو خطأ منطقي

آسفة لم أجرب البرنامج ولكن!

هذا عبارة عن إيجاد الـ factorial number للعدد n!

ومتعجبة من كلمة sum في السؤال لأنه ليس مجموع بل حاصل ضرب product...

عموماً هذا السؤال وهذا التطبيق معروف ومشهور للغاية وهو من أشهر الأمثلة على استخدام الـ Recursion

على سبيل المثال البرنامج التالي يحسب الـ Factorial Number لأي عدد وباستعمال طريقة الـ Recursion

int factorial(int number) {
	int temp;

	if(number <= 1) return 1;

	temp = number * factorial(number - 1);
	return temp;
}

ملاحظة: لم أقم بتجربة البرنامج ايضاً ولكنه كذلك

للمزيد من الرابط التالي

هـ;ــا

ويمكننا عمله ايضاً بواسطة الـ loop ...

موفق يارب

تم تعديل هذه المشاركة بواسطة ♥ حُوريّة ♥ في 4 يناير 2011 في 23:16

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#4

شکرا لکما جزیلا و جزاکما الله خیرا...

أخی Mohammad alsadek:

شکرا لک أخی لتصحیح و لکن أنا أجرب الکود مع Visual Studio 2010 و بذلک الطریقة الذی قلت یشغل بشکل صحیح.. و أیضا أنا هنا کتبت الدالة فقط :) .

شکرا لردک

أخت حوریة:

شکرا لردک أیضا..

ولکن کما عرفتُ من السوال هو لا یسئل عنا عن n! .

بل یسئل عنا عن جمع الأرقام فی n! یعنی

1*2*3*4*5 = 15

و مثلا فی : 17 النتیجة هی : 8

و هکذا...

شکرا لکما ،

أنا ما وصلت بالنتیجة...

#5
C77431 كتب:

أخت حورية:

شکرا لردک أيضا..

ولکن کما عرفتُ من السوال هو لا يسئل عنا عن n! .

بل يسئل عنا عن جمع الأرقام في n! يعني

1*2*3*4*5 = 15

و مثلا في : 17 النتيجة هي : 8

و هکذا...

شکرا لکما ،

أنا ما وصلت بالنتيجة...

عفواً أخي المكرم

آسفة كان السؤال غير واضح بالإقتباس لأن علامة التعجب كانت ببداية السطر في السؤال!

ولكن حقيقة السؤال(ربما) هي إيجاد !n (للعدد 100) ومن ثم إيجاد ناتج جمع الأرقام في ذلك العدد...

مثلاً

5! = 120

and then

1 + 2 + 0 = 3

هذا يعني إيجاد العدد !100 ومن ثم إيجاد مجموع الأرقام في ذلك العدد

هكذا ربما

موفق يارب

تم تعديل هذه المشاركة بواسطة ♥ حُوريّة ♥ في 5 يناير 2011 في 00:22

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#6

و لکن هل یوجد جهاز الذی یقدر علی 100! ؟؟!!!

هو عدد کبیر جدا..

والله أعلم

شکرا لک

#7
C77431 كتب:

و لکن هل يوجد جهاز الذي يقدر علي 100! ؟؟!!!

هو عدد کبير جدا..

والله أعلم

شکرا لک

عفواً

علامتين استفهام وتلاتة تعجب :happy:

نعم!

حاول تشغيل الحاسبة لديك بالنظام واعمل عملية !100

من الذي حسب هذا العدد نحن أم الجهاز؟

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

ولكن المشكلة في تخزين الناتج في المتغيرات

وعموماً هذا الواضح من السؤال وكانت إجابتي نموذجية بحسب فهمي للسؤال

ما كنت مهتمة لأصل البرنامج والتطبيق أنت تقول (ربما لم أفهم السؤال)

وهذه " 1*2*3*4*5 = 15 " في مشاركتك السابقة معادلة غير صائبة حسابية

وهكذا هو الواضح من السؤال كما يبدوا بالنسبة لي

موفق يارب

1

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#8

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

نحتاج إلى التعامل مع عدد خانات كبير جداً مقارنة بأي نوع أعداد في ++C. يمكنك استخدام مكتبة Arbitrary Precision Integers أو أن تقوم بكتابة الـ Implementation بنفسك. حسب ما يظهر لدي, فأنا قمت بحل السؤال بواسطة مكتبة MAPM :P.

أذكر أني كتبت موضوعاً عن كيفية إعداد المكتبة للعمل, و هذا الكود الذي وجدته ضمن الأكود التي لدي لحل السؤال(لا تخف quick/dirty و لكن يعطي الإجابة الصحيحة :wink: ):

char numberString[2048] = {0};
MAPM number = 100, fact = 0;
MAPM sum = 0;

fact = number.factorial();

fact.toIntegerString( numberString );

for( int i = 0; i < strlen( numberString ); i++ )
	sum += numberString - '0';

std::cout << sum;

تحياتي...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 5 يناير 2011 في 03:08

4
#9

شکرا جزیلا لکم...

أنا الآن أجرب ، إن وجدت إستفسارا فسأسئل...

شکرا جزیلا لکم مرة أخری و آسف لإزعاج..

#10

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

أخي المكرم خالد

إذا تكرمت طباعة النتيجة لنا الـ output تبع البرنامج

شاكرة إهتمامك :happy:

موفق يارب

تم تعديل هذه المشاركة بواسطة ♥ حُوريّة ♥ في 5 يناير 2011 في 04:04

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#11

شکرا للجمیع...

و شکرا خاص لأخی خالد.

لقد وجدتُ الجواب بطریقة أخری فقط مع :

#include <iostream>

:)

ولکن هذا کودی هو very dirty :lol: .

لقد استخدمتُ arrays لتخزین و بعض for .

 

/**************** C77431 ***************/


#include <iostream>
using namespace std;


void problem20 ()
{
int mul[3000]={0};
int n1=0,n2=0,n3=0;
int number;

mul[0]=1;

for (int a=1; a<=100; a++)
{
  number=a;
  if (number>99)
  {
   n3=1;
   n2=0;
   n1=0;
  }
  else if(number>9)
  {
   n3=0;
   n2=number/10;
   n1=number%10;
  }
  else
   n1=number;



  int temp1[3000]={0};
  int temp2[3000]={0};
  int temp3[3000]={0};

  for (int c=0; c<3000; c++)
  {
   temp1[c]+=(n1*mul[c]);

   if (temp1[c]>9)
    if (c<2999)
    {   
 	temp1[c+1]+=(temp1[c]/10);
 	temp1[c]=(temp1[c]%10);
    }
    else
    {
 	cout<<"Overflow!...";
 	system("pause");
 	return ;
    };
  }

  for (int d=0; d<3000; d++)
  {
   temp2[d+1]+=n2*mul[d];
   if (temp2[d+1]>9)
    if (d<2999)
    {
 	temp2[d+2]+=(temp2[d+1]/10);
 	temp2[d+1]=(temp2[d+1]%10);
    }
    else
    {
 	cout<<"Overflow!...";
 	system("pause");
 	return ;
    };
  }

  if (a==100)
  {
   for (int e=0; e<3000; e++)
   {
    temp3[e+2]+=n3*mul[e];
    if (temp3[e+2]>9)
 	if (e<2999)
 	{
      temp3[e+3]+=(temp3[e+2]/10);
      temp3[e+2]=(temp3[e+2]%10);
 	}
 	else
 	{
      cout<<"Overflow!...";
      system("pause");
      return ;
 	};
   }
  }

  if (a==1) mul[0]=0;
  for (int f=0; f<3000; f++)
  {
   mul[f]=(temp1[f]+temp2[f]+temp3[f]);
  }

}

int sum=0;
for (int g=0; g<3000; g++)
{
  sum+= mul[g];

}

cout<<"sum is: "<<sum;


}


int main()
{
problem20();

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

تم تعديل هذه المشاركة بواسطة C77431 في 5 يناير 2011 في 05:47

2

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

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