কোনও সংখ্যাটি প্যালিনড্রোম কিনা তা আমি কীভাবে পরীক্ষা করব?


127

কোনও সংখ্যাটি প্যালিনড্রোম কিনা তা আমি কীভাবে পরীক্ষা করব?

যেকোনো ভাষা. যে কোনও অ্যালগরিদম। (সংখ্যাটিকে একটি স্ট্রিং তৈরি করার এবং তারপরে স্ট্রিংটি বিপরীত করার আলগোরিদিম ব্যতীত)।


5
আপনি বিট মধ্যে পূর্ণসংখ্যার আকার জানতে পারেন? যদি হ্যাঁ, বলুন A হ'ল হ'ল এবং এর আকার হ'ল B = A << s / 2 চেক করে যদি অ্যান্ডবি == 2 ^ এস -1 - 2 ^ (গুলি / 2) + 1
নিতিন গার্গ

10
'সংখ্যাটি একটি স্ট্রিং তৈরি করা এবং তারপরে স্ট্রিংটি বিপরীত করা' এর সাথে কী সমস্যা?
কর্নেল আতঙ্ক

এই প্রসঙ্গে অর্থ কী numberএবং is a palindromeতা বোঝাতে শুরু করুন : 13E31 (বেস দশ) কেমন? 01210 (শূন্যের অগ্রণী)? + 10-10 + 1 (পাঁচ অঙ্কের ভারসাম্য ত্রৈমাসিক)?
গ্রেইবার্ড

উত্তর:


128

এটি প্রোজেক্ট অলারের অন্যতম সমস্যা । আমি যখন এটি হ্যাসকেলে সমাধান করেছি তখন আপনার পরামর্শ অনুসারে আমি ঠিক ঠিক তাই করেছি, সংখ্যাটি একটি স্ট্রিংয়ে রূপান্তর করুন। তারপরে স্ট্রিংটি প্যালিনড্রোম কিনা তা পরীক্ষা করা তুচ্ছ। যদি এটি যথেষ্ট ভাল সম্পাদন করে, তবে কেন এটিকে আরও জটিল করে তোলা বিরক্ত করবেন? প্যালিনড্রোম হ'ল গাণিতিকের চেয়ে কল্পিত সম্পত্তি।


14
প্রকৃতপক্ষে. আপনার করা যে কোনও অ্যালগরিদমকে কমপক্ষে সংখ্যাটি বেস -10 সংখ্যায় বিভক্ত করতে হবে, যা 90% যাইহোক স্ট্রিংয়ে রূপান্তরিত।
ব্লারগবার্ড

5
এটি অবশ্যই একটি স্ট্রিংয়ে রূপান্তরিত করার জন্য একটি ঝরঝরে কৌশল তবে এটি আপনাকে এক সাক্ষাত্কারে জিজ্ঞাসা করা হলে এটি বিন্দুটিকে হারাবে কারণ আপনি মোডুলো বুঝতে পারছেন কিনা তা নির্ধারণ করতে হবে।
রবার্ট নোক

7
@ রবার্ট নাক - সাক্ষাত্কার গ্রহণকারী আপনাকে একটি পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করতে একটি অ্যালগরিদম বর্ণনা করতে বলতে চাইতে পারে, অবশ্যই অবশ্যই আপনাকে মডুলো বুঝতে হবে।
স্টিভ 314

@ স্টিভ 314 to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo- না। টার্গেট নম্বর সিস্টেমে কম্পিউটিং করা, যুক্ত করতে সক্ষম হবেন (চিন্তা করুন আপনি কীভাবে সাধারণভাবে দশমিক থেকে দ্বৈত রূপান্তর করেন - গণনা ভাবার অর্থ বাইনারি মানেই আপনি করতে পারবেন না, উদাহরণস্বরূপ, দশমিক গাণিতিক (এবং আপনি এটি করতে পারেন বাইনারি থেকে বিভাজন বা মডিউল ছাড়াই ডেসিমাল রূপান্তর 2)
গ্রেইবার্ড

@ গ্রেইবার্ড - আমি ধরে নিচ্ছি যে গাণিতিকটি গাণিতিক সমর্থন করে এবং স্ট্রিং অপারেশনগুলি যে ধরণের স্ট্রিং অপারেশনগুলিকে সমর্থন করে সেই ধরণের স্ট্রিং অপারেশনগুলি সম্পন্ন হয় - এটি স্ট্রিংয়ের জন্য পূর্ণসংখ্যা এবং প্রিপেন্ডিং অক্ষরের জন্য বিভাগ এবং মডুলো / বাকী অংশ। অবশ্যই আপনি নিজের জন্য স্ট্রিংগুলিতে গাণিতিক প্রয়োগ করতে পারেন , কিন্তু (1) আপনি কি সত্যিই যাচ্ছেন? কেবল একটি পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করতে ?, এবং (২) আপনি এটিকে (অকার্যকরভাবে) পরিচালনা করতে পারলেও, আপনাকে কিছুটা সময় ধরে অবশিষ্টাংশগুলি বুঝতে হবে - এটি ছাড়া স্ট্রিংগুলিতে আপনার সম্পূর্ণ পূর্ণসংখ্যার পাটিগণিত নেই।
স্টিভ 314

269

যে কোনও প্রদত্ত সংখ্যার জন্য:

n = num;
rev = 0;
while (num > 0)
{
    dig = num % 10;
    rev = rev * 10 + dig;
    num = num / 10;
}

তাহলে n == revতারপর numএকটি যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে হল:

cout << "Number " << (n == rev ? "IS" : "IS NOT") << " a palindrome" << endl;

এটাই আমি ডাব্লু / খুব উপরে এসেছি। আমার এখন এটি পোস্ট করার কোনও ধারণা নেই। +1
Esteban Araya

এটি কি ধরে নিচ্ছে যে রেভটি শূন্যে আরম্ভ করা হয়েছে?
জাস্টসাল্ট

হ্যাঁ জাস্টসাল্ট রেভ ভেরিয়েবলটি শূন্যে আরম্ভ করা হয়।
হোর্হে ফেরেইরা

31
পথচারীদের জন্য নোট: যদি এটি এমন কোনও ভাষায় প্রয়োগ করা হয় যা numবিভাগের পরে (লুজার টাইপিং) এর ভগ্নাংশের অংশ রাখে , আপনাকে এটি তৈরি করতে হবে num = floor(num / 10)
উইজগুয়ে

22
এই সমাধানটি সম্পূর্ণ সঠিক নয়। ভেরিয়েবল খনন সম্ভবত উপচে পড়তে পারে। উদাহরণস্বরূপ, আমি ধরে নিলাম num এর প্রকারটি int হয়, মানটি প্রায় পূর্ণসংখ্যা.ম্যাক্স, এর শেষ অঙ্কটি 789 হয়, যখন বিপরীত খনন হয়, তারপরে ওভারফ্লো হয়।
জিয়াজি লি

24
def ReverseNumber(n, partial=0):
    if n == 0:
        return partial
    return ReverseNumber(n // 10, partial * 10 + n % 10)

trial = 123454321
if ReverseNumber(trial) == trial:
    print("It's a Palindrome!")

শুধুমাত্র পূর্ণসংখ্যার জন্য কাজ করে। যদি ভাসমান পয়েন্ট সংখ্যা বা নেতৃস্থানীয় শূন্যগুলি বিবেচনা করা দরকার তবে সমস্যা বিবরণী থেকে এটি অস্পষ্ট।


22

তুচ্ছ সমস্যা থাকা বেশিরভাগ উত্তরের উপরে ইন্ট ভেরিয়েবল সম্ভবত উপচে পড়তে পারে।

পড়ুন http://articles.leetcode.com/palindrome-number/

boolean isPalindrome(int x) {
    if (x < 0)
        return false;
    int div = 1;
    while (x / div >= 10) {
        div *= 10;
    }
    while (x != 0) {
        int l = x / div;
        int r = x % 10;
        if (l != r)
            return false;
        x = (x % div) / 10;
        div /= 100;
    }
    return true;
}

সংখ্যাগুলি যখন শূন্য থাকে তখন ব্যর্থ হবে। উদাহরণ: 10000021.
Viraj


9

প্রতিটি পৃথক অঙ্ক একটি স্ট্যাকের উপর চাপুন, তারপরে সেগুলি পপ করুন। যদি এটি একই ফরোয়ার্ড এবং পিছনে হয় তবে এটি একটি প্যালিনড্রোম।


আপনি পূর্ণসংখ্যা থেকে প্রতিটি পৃথক অঙ্ক কীভাবে ঠেলাবেন?
এস্তেবান আরায়া

1
এর লাইন বরাবর কিছু: int ফার্স্টডিজিট = আসল নাম্বার% 10; int tmpNumber = originalNumber / 10; int সেকেন্ডডিজিট = tmpNumber% 10; .... আপনার কাজ শেষ না হওয়া পর্যন্ত
অনুদান লিমবার্গ

এটি লেটকোড প্রশ্নের প্রসঙ্গে কাজ করবে না - কোনও অতিরিক্ত স্থানের অনুমতি নেই।
হলোগ্রাম

8

অতিরিক্ত কোনও স্থান ব্যবহার না করেই এই সমস্যার সমাধান করা এমন কোনও উত্তর আমি লক্ষ্য করিনি, অর্থাত্, আমি যে সমস্ত সমাধান দেখেছি সেগুলি একটি স্ট্রিং, বা সংখ্যাটি বিপরীত করার জন্য অন্য কোনও পূর্ণসংখ্যা বা অন্য কোনও ডেটা স্ট্রাকচার ব্যবহার করেছে।

যদিও জাভা-র মতো ভাষা পূর্ণসংখ্যার ওভারফ্লোতে প্রায় মোড়ানো, সি এর মতো ভাষায় এই আচরণটি পূর্বনির্ধারিত (জাভাতে 2147483647 (ইন্টিজার.ম্যাক্স_ভালিউ) বিপরীত করার চেষ্টা করুন )
ওয়ার্কআরউন্ডটি দীর্ঘ বা কিছু ব্যবহার করতে পারে তবে, স্টাইলিস্টিকভাবে, আমি বেশ কিছু করি না যে পদ্ধতির মত।

এখন, একটি প্যালিনড্রমিক সংখ্যার ধারণাটি হ'ল যে সংখ্যাটি একই রকম এবং সামনের দিকে পড়তে হবে। গ্রেট। এই তথ্য ব্যবহার করে, আমরা প্রথম সংখ্যা এবং শেষ সংখ্যাটি তুলনা করতে পারি। ট্রিকটি প্রথম অঙ্কের জন্য আমাদের সংখ্যার ক্রম দরকার। বলুন, 12321. এটি 10000 দ্বারা ভাগ করা আমাদের শীর্ষস্থানীয় 1টি পেতে পারে The ট্রুলিং 1টি 10 ​​এর সাথে মোড গ্রহণ করে পুনরুদ্ধার করা যেতে পারে Now এখন, এটি হ্রাস করার জন্য ২২২ এ (12321 % 10000)/10 = (2321)/10 = 232। এবং এখন, 10000 টি 2 এর গুণক দ্বারা হ্রাস করা দরকার So সুতরাং এখন জাভা কোডে ...

private static boolean isPalindrome(int n) {
    if (n < 0)
        return false;

    int div = 1;
    // find the divisor
    while (n / div >= 10)
        div *= 10;

    // any number less than 10 is a palindrome
    while (n != 0) {
        int leading = n / div;
        int trailing = n % 10;
        if (leading != trailing)
            return false;

        // % with div gets rid of leading digit
        // dividing result by 10 gets rid of trailing digit
        n = (n % div) / 10;

        // got rid of 2 numbers, update div accordingly
        div /= 100;
    }
    return true;
}

সংখ্যায় শূন্য রয়েছে এমন মামলাগুলি কভার করার জন্য হার্দিকের পরামর্শ অনুসারে সম্পাদিত ।


6

পাইথনে, একটি দ্রুত এবং পুনরাবৃত্ত উপায় রয়েছে।

def reverse(n):
    newnum=0
    while n>0:
        newnum = newnum*10 + n % 10
        n//=10
    return newnum

def palindrome(n):
    return n == reverse(n)

এটি পুনরাবৃত্তির সাথে মেমরির সমস্যাগুলিও প্রতিরোধ করে (জাভাতে স্ট্যাকওভারফ্লো ত্রুটির মতো)


বন্ধ করুন, তবে আপনি এটি করছেন এমন সময় পরিবর্তন করছেন। আপনি মূল এন মানটি সঞ্চয় করতে চান এবং পরিবর্তে তার তুলনা করে
রিটার্নটি করতে চান

6

আমি জানি সবচেয়ে দ্রুততম উপায়:

bool is_pal(int n) {
    if (n % 10 == 0) return 0;
    int r = 0;
    while (r < n) {
        r = 10 * r + n % 10;
        n /= 10;
    }
    return n == r || n == r / 10;
}

120 (দশমিক) একটি "দশমিক প্যালিনড্রোম"? অবিশ্বাস্যভাবে দ্রুত, এবং একুর উত্তরের অনুরূপ ।
গ্রেইবার্ড

5

শুধু মজাদার জন্য, এটিও কাজ করে।

a = num;
b = 0;
if (a % 10 == 0)
  return a == 0;
do {
  b = 10 * b + a % 10;
  if (a == b)
    return true;
  a = a / 10;
} while (a > b);
return a == b;

5

সংখ্যাটি একটি স্ট্রিং তৈরি করা এবং তারপরে স্ট্রিংটিকে বিপরীত করা ছাড়া

কেন সেই সমাধানটি বরখাস্ত করবেন? এটি কার্যকর করা সহজ এবং পাঠযোগ্য । যদি আপনাকে 2**10-23ডেসিম্যাল প্যালিনড্রোম কিনা তা কম্পিউটারে হাতে না জিজ্ঞাসা করা হয় , আপনি অবশ্যই এটি দশমিকের মধ্যে লিখে পরীক্ষা করে দেখবেন।

পাইথনে কমপক্ষে 'স্ট্রিং অপারেশনগুলি গাণিতিকের চেয়ে ধীর' ​​শ্লোগানটি আসলে মিথ্যা। আমি স্মিংকের পাটিগণিত অ্যালগরিদমকে সাধারণ স্ট্রিং বিপরীতে তুলনা করেছি int(str(i)[::-1])। গতিতে কোনও তাত্পর্যপূর্ণ পার্থক্য ছিল না - এটি ঘটেছিল স্ট্রিং বিপরীতটি সামান্য দ্রুত ছিল।

সংকলিত ভাষায় (সি / সি ++) স্লোগানটি ধরে রাখতে পারে তবে একটির সংখ্যার সাথে ওভারফ্লো ত্রুটির ঝুঁকি রয়েছে।

def reverse(n):
    rev = 0
    while n > 0:
        rev = rev * 10 + n % 10
        n = n // 10
    return rev

upper = 10**6

def strung():
    for i in range(upper):
        int(str(i)[::-1])

def arithmetic():
    for i in range(upper):
        reverse(i)

import timeit
print "strung", timeit.timeit("strung()", setup="from __main__ import strung", number=1)
print "arithmetic", timeit.timeit("arithmetic()", setup="from __main__ import arithmetic", number=1)

সেকেন্ডে ফলাফল (কম ভাল):

স্ট্রং 1.50960231881 গাণিতিক 1.69729960569


4

আমি খুব নিষ্ঠুরতাপূর্ণ উপায় ব্যবহার করে অয়লার সমস্যার উত্তর দিয়েছি। স্বাভাবিকভাবেই, যখন আমি নতুন আনলকযুক্ত সম্পর্কিত ফোরাম থ্রেড পেয়েছিলাম তখন প্রদর্শনীতে অনেক বেশি স্মার্ট অ্যালগরিদম ছিল। যথা, হ্যান্ডেল বেগোনারের কাছে যাওয়া একজন সদস্যের এমন অভিনব দৃষ্টিভঙ্গি ছিল, যে আমি তার অ্যালগরিদম ব্যবহার করে আমার সমাধানটি পুনরায় প্রয়োগ করার সিদ্ধান্ত নিয়েছিলাম। তার সংস্করণটি পাইথনে ছিল (নেস্টেড লুপ ব্যবহার করে) এবং আমি এটি ক্লোজুরে (একটি একক লুপ / ​​পুনরায় ব্যবহার করে) পুনরায় প্রয়োগ করেছি।

আপনার বিনোদন জন্য এখানে:

(defn palindrome? [n]
  (let [len (count n)]
    (and
      (= (first n) (last n))
      (or (>= 1 (count n))
        (palindrome? (. n (substring 1 (dec len))))))))

(defn begoners-palindrome []
  (loop [mx 0
         mxI 0
         mxJ 0
         i 999
         j 990]
    (if (> i 100)
      (let [product (* i j)]
        (if (and (> product mx) (palindrome? (str product)))
          (recur product i j
            (if (> j 100) i (dec i))
            (if (> j 100) (- j 11) 990))
          (recur mx mxI mxJ
            (if (> j 100) i (dec i))
            (if (> j 100) (- j 11) 990))))
      mx)))

(time (prn (begoners-palindrome)))

প্রচলিত লিস্পের উত্তরগুলিও ছিল তবে তারা আমার কাছে আপত্তিজনক ছিল।


1
আমি এখানে পোস্ট করা কিছু "গাণিতিক" প্যালিনড্রোম পরীক্ষার চেষ্টা করেছি, কিন্তু অবাক হয়েছি যে এই স্ট্রিং ভিত্তিক সংস্করণটি দ্রুততর ছিল faster
ক্রিস ভেস্ট

সম্ভবত এটি আশ্চর্যজনক হওয়া উচিত নয় - সর্বোপরি, আপনি যে প্যালিনড্রোমটি দিয়েছিলেন তার দ্রুততম উপায়টি প্রথমার্ধটি পড়ার পরে দ্বিতীয়ার্ধকে পিছনের দিকে পড়া ছিল, কোনও ধরণের পাটিগণিত দ্বারা নয়
জুবিন মুখার্জি

4

এখানে এমন একটি স্কিম সংস্করণ রয়েছে যা কোনও ফাংশন তৈরি করে যা কোনও বেসের বিরুদ্ধে কাজ করবে। এটি একটি অপ্রয়োজনীয় চেক আছে: সংখ্যাটি বেসের একাধিক (0 এ শেষ হয়) হলে দ্রুত মিথ্যা ফিরুন।
এবং এটি পুরো বিপরীত সংখ্যাটি পুনর্নির্মাণ করে না, কেবল অর্ধেক।
আমাদের এটাই দরকার।

(define make-palindrome-tester
   (lambda (base)
     (lambda (n)
       (cond
         ((= 0 (modulo n base)) #f)
         (else
          (letrec
              ((Q (lambda (h t)
                    (cond
                      ((< h t) #f)
                      ((= h t) #t)
                      (else
                       (let*
                           ((h2 (quotient h base))
                            (m  (- h (* h2 base))))
                         (cond
                           ((= h2 t) #t)
                           (else
                            (Q h2 (+ (* base t) m))))))))))
            (Q n 0)))))))

4

সংখ্যাকে স্ট্রিংয়ে রূপান্তর না করে রুবিতে পুনরাবৃত্ত সমাধান।

def palindrome?(x, a=x, b=0)
  return x==b if a<1
  palindrome?(x, a/10, b*10 + a%10)
end

palindrome?(55655)

3

গোলং সংস্করণ:

package main

import "fmt"

func main() {
    n := 123454321
    r := reverse(n)
    fmt.Println(r == n)
}

func reverse(n int) int {
    r := 0
    for {
        if n > 0 {
            r = r*10 + n%10
            n = n / 10
        } else {
            break
        }
    }
    return r
}

2

প্রথম এবং শেষ অঙ্কগুলি পপ অফ করুন এবং আপনার রান আউট না হওয়া পর্যন্ত এগুলি তুলনা করুন। কোনও অঙ্ক বাকী থাকতে পারে বা নাও থাকতে পারে, তবে উভয় উপায়ে যদি সমস্ত পপড অফ অঙ্ক মেলে তবে এটি প্যালিনড্রোম।


2

এখানে টেমপ্লেট ব্যবহার করে সি ++ তে আরও একটি সমাধান দেওয়া হয়েছে। এই সমাধানটি সংবেদনশীল প্যালিনড্রোম স্ট্রিং তুলনার জন্য কাজ করবে।

template <typename bidirection_iter>
bool palindrome(bidirection_iter first, bidirection_iter last)
{
    while(first != last && first != --last)
    {
        if(::toupper(*first) != ::toupper(*last))
            return false;
        else
            first++;
    }
    return true;
}

1

@ স্মিঙ্ক পদ্ধতির চেয়ে কিছুটা ভাল ধ্রুবক ফ্যাক্টর সহ একটি পদ্ধতি:

num=n
lastDigit=0;
rev=0;
while (num>rev) {
    lastDigit=num%10;
    rev=rev*10+lastDigit;
    num /=2;
}
if (num==rev) print PALINDROME; exit(0);
num=num*10+lastDigit; // This line is required as a number with odd number of bits will necessary end up being smaller even if it is a palindrome
if (num==rev) print PALINDROME

1

এখানে আফার # সংস্করণ:

let reverseNumber n =
    let rec loop acc = function
    |0 -> acc
    |x -> loop (acc * 10 + x % 10) (x/10)    
    loop 0 n

let isPalindrome = function
    | x  when x = reverseNumber x -> true
    | _ -> false

1

এর স্ট্রিং প্রতিনিধিত্ব প্যালিনড্রমিক হলে একটি সংখ্যা প্যালিনড্রোমিক হয়:

def is_palindrome(s):
    return all(s[i] == s[-(i + 1)] for i in range(len(s)//2))

def number_palindrome(n):
    return is_palindrome(str(n))

1
def palindrome(n):
    d = []
    while (n > 0):
        d.append(n % 10)
        n //= 10
    for i in range(len(d)/2):
        if (d[i] != d[-(i+1)]):
            return "Fail."
    return "Pass."

1

প্রদত্ত নম্বরটি পরীক্ষা করার জন্য প্যালিনড্রোম রয়েছে কিনা (জাভা কোড)

class CheckPalindrome{
public static void main(String str[]){
        int a=242, n=a, b=a, rev=0;
        while(n>0){
                    a=n%10;  n=n/10;rev=rev*10+a;
                    System.out.println(a+"  "+n+"  "+rev);  // to see the logic
               }
        if(rev==b)  System.out.println("Palindrome");
        else        System.out.println("Not Palindrome");
    }
}

1

এখানে পোস্ট করা অনেকগুলি সমাধান পূর্ণসংখ্যার বিপরীত হয় এবং এটি একটি ভেরিয়েবলে সংরক্ষণ করে যা অতিরিক্ত স্থান ব্যবহার করে যা এটি হয় O(n)তবে এখানে O(1)স্থান সহ একটি সমাধান রয়েছে ।

def isPalindrome(num):
    if num < 0:
        return False
    if num == 0:
        return True
    from math import log10
    length = int(log10(num))
    while length > 0:
        right = num % 10
        left = num / 10**length
        if right != left:
            return False
        num %= 10**length
        num /= 10
        length -= 2
    return True

1

আমি এই অজগর সমাধানটি এর সংক্ষিপ্ততার কারণে সর্বদা ব্যবহার করি।

def isPalindrome(number):
    return int(str(number)[::-1])==number

4
এটি কমপ্যাক্ট, তবে ওপি বিশেষত বলেছে " সংখ্যাকে একটি স্ট্রিং তৈরি করে এবং তারপরে স্ট্রিংটি উল্টানো আলগোরিদিম ব্যতীত "
এডওয়ার্ড

0

এটা চেষ্টা কর:

reverse = 0;
    remainder = 0;
    count = 0;
    while (number > reverse)
    {
        remainder = number % 10;
        reverse = reverse * 10 + remainder;
        number = number / 10;
        count++;
    }
    Console.WriteLine(count);
    if (reverse == number)
    {
        Console.WriteLine("Your number is a palindrome");
    }
    else
    {
        number = number * 10 + remainder;
        if (reverse == number)
            Console.WriteLine("your number is a palindrome");
        else
            Console.WriteLine("your number is not a palindrome");
    }
    Console.ReadLine();
}
}

0

অজগরের স্ট্যাক হিসাবে এখানে একটি সমাধান ব্যবহারের তালিকা রয়েছে:

def isPalindromicNum(n):
    """
        is 'n' a palindromic number?
    """
    ns = list(str(n))
    for n in ns:
        if n != ns.pop():
            return False
    return True

স্ট্যাক পপিং তুলনার জন্য কেবল সংখ্যার ডান দিক বিবেচনা করে এবং চেকগুলি হ্রাস করতে এটি দ্রুত ব্যর্থ হয়


0
 public class Numbers
 {
   public static void main(int givenNum)
   { 
       int n= givenNum
       int rev=0;

       while(n>0)
       {
          //To extract the last digit
          int digit=n%10;

          //To store it in reverse
          rev=(rev*10)+digit;

          //To throw the last digit
          n=n/10;
      }

      //To check if a number is palindrome or not
      if(rev==givenNum)
      { 
         System.out.println(givenNum+"is a palindrome ");
      }
      else
      {
         System.out.pritnln(givenNum+"is not a palindrome");
      }
  }
}

0
let isPalindrome (n:int) =
   let l1 = n.ToString() |> List.ofSeq |> List.rev
   let rec isPalindromeInt l1 l2 =
       match (l1,l2) with
       | (h1::rest1,h2::rest2) -> if (h1 = h2) then isPalindromeInt rest1 rest2 else false
       | _ -> true
   isPalindromeInt l1 (n.ToString() |> List.ofSeq)

0
checkPalindrome(int number)
{
    int lsd, msd,len;
    len = log10(number);
    while(number)
    {
        msd = (number/pow(10,len)); // "most significant digit"
        lsd = number%10; // "least significant digit"
        if(lsd==msd)
        {
            number/=10; // change of LSD
            number-=msd*pow(10,--len); // change of MSD, due to change of MSD
            len-=1; // due to change in LSD
            } else {return 1;}
    }
    return 0;
}

খারাপ, খারাপ সমাধান। লগ 10 সত্যই ধীর, ভাসমান-পয়েন্ট অপারেশন। এটি ব্যবহার করবেন না।
রোক ক্রালজ

0

পুনরাবৃত্তির উপায়, খুব দক্ষ নয়, কেবল একটি বিকল্প সরবরাহ করুন

(পাইথন কোড)

def isPalindrome(num):
    size = len(str(num))
    demoninator = 10**(size-1)
    return isPalindromeHelper(num, size, demoninator)

def isPalindromeHelper(num, size, demoninator):
    """wrapper function, used in recursive"""
    if size <=1:
        return True
    else:       
        if num/demoninator != num%10:
            return False
        # shrink the size, num and denominator
        num %= demoninator
        num /= 10
        size -= 2
        demoninator /=100
        return isPalindromeHelper(num, size, demoninator) 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.