مسألة أويلر رقم 4: الأرقام المتناظرة « مغامرات برمجية

مسألة أويلر رقم 4: الأرقام المتناظرة

نّشر في: 2011/06/02
وسوم: ,
تعليقات: 8 تعليق

Project Euler Problem 4

نص السؤال:

الرقم المتناظر (palindrome) هو رقم يمكن قرائته بنفس الطريقة من الجهتين. أكبر رقم متناظر ينتج عن حاصل ضرب رقمين ذو خانتين هو 9009 = 91 × 99.

أوجد أكبر رقم متناظر ينتج من حاصل ضرب رقمين لهما ثلاثة خانات.

تعديل: الأخ yaseenta وجد خطأً حقيقياً وكبيراً في الحل. وقمت بتعديله مع الشكر :)

 

نـــص مخـــفي: التحليل أظــهــر

 

نـــص مخـــفي: الحل أظــهــر

Post to Twitter

8 تعليق - أضف تعليق
  1. yaseenta قال:

    أخي العزيز لماذا حصرت الارقام من 111 إلى 999
    أليس المفروض أن عددها 999-100+1=900 وبذلك تكون عدد الإحتمالات 810000
    حين قرأت الحل لم تعجبني الـbrute force المستخدمة في الحل.ففكرت بطريقة حل أخرى إعتماداً على العوامل الأولية prime factors. أتمنى مطالعتك للحل والتعقيب. الكود بالجافا وأظن سهل فهمه.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // private HashMap<Long,ArrayList<Long>> palindromeNumber=new HashMap<Long,ArrayList<Long>>();

    for(long i=1;i<=9;i++)
        for(long j=0;j<=9;j++)
            for(long k=0;k<=9;k++){
                long num5Gram=i*10000+j*1000+k*100+j*10+i;                 
                long num6Gram=i*100000+j*10000+k*1000+k*100+j*10+i;
                isPalindrome(num5Gram);
                isPalindrome(num6Gram);
    }
    ....
    public boolean isPalindrome(long theNum){
        long oldNum=theNum;
        ArrayList<Long> factorList=new ArrayList<Long>();
        for (long i = 100; i <= theNum / i; i++) {
            while (theNum % i == 0) {
                //add the factor
                factorList.add(i);//
                theNum = theNum / i;
            }            
        }
        if(theNum ==oldNum || theNum <100 || theNum>999) {
            return false;
        }
        else
            factorList.add(theNum);
        //save the number and its factor
        //palindromeNumber.put(oldNum, factorList);
        return true;
    }
    • System Down قال:

      أنت محق! الاحتمالات ستكون من 100-999! علي أن أصحح المدونة.

      بالنسبة لبرنامجك… لا أعرف إذا كانت هذه الطريقة أسرع أم لا. عملية إيجاد العوامل الأولية عملية مكلفة. ولكن من ناحية أخرى أنت لن تقوم بها سوى 2000 مرة (10×10×10×2). بينما برنامجي أنا سيقوم بعملية slicing لحوالي 810000 رقم. علي أن أقوم بتجاربي الخاصة في هذا الموضوع. ولكن طريقتك مثيرة للاهتمام جداً :)

      شكراً لمرورك :)

      • yaseenta قال:

        أتمنى أن تعدل على ردي السابق فهناك خطأ والصحيح هو primary factors. لا أعلم كيف كتبتهابتلك الصورة…
        بالنسبة للطريقة التي إستخدمتها فهي تأخذ نفس المبدأ في إيجاد العوامل الأولية ولكن تحصل البحث عنها إبتداء من 100 وهو أول عدد ثلاثي الأرقام وبذلك تنحصر عملية البحث في إطار ضيق فتصبح العملية أسرع. ستكون هناك ثلاثة معاملات على الأكثر.

        • youssef قال:
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          #include<stdio.h>
          #include<windows.h>

          BOOL NotPal(int nbr);

          main()
          {
                int a=1000,b= 1000,max=0,product;
                     
                while(--b,a=1000,b>100)
                    while(--a,product=a*b,( !(product % 10) ? 0 : !NotPal(product)? max<product ? max=product :0 : 0), a>100);
                   
               
          printf("max palindromic number : %d\n",max);
          }

          BOOL NotPal(int nbr)
          {
               int revers=0;
               int tmp=nbr;

               while(tmp)
               {
                  revers = (revers * 10) + tmp % 10;
                  tmp /= 10;
               }
               
              return revers != nbr;  
          }

          good luck !!

  2. For latest news you have to pay a quick visit web and on internet I found this site as a finest
    site for latest updates.

  3. Thanks designed for sharing such a good opinion, article is fastidious, thats why i have read it completely

  4. Hmm it seems like your site ate my first
    comment (it was extremely long) so I guess I’ll just sum it up what I had written and
    say, I’m thoroughly enjoying your blog. I as well am an aspiring blog blogger but I’m still new to everything.

    Do you have any points for rookie blog writers? I’d definitely appreciate
    it.

  5. Valuable info. Lucky me I found your web site by chance, and I’m
    surprised why this coincidence did not came about in advance!
    I bookmarked it.

أضف تعليق

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

*

يمكنك استخدام أكواد HTML والخصائص التالية: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


مرحباً , تاريخ اليوم هو الثلاثاء, 2017/02/21