هل يمكنني الحصول على بعض الملاحظات على هذه الوظيفة `ispalindrome ()` `في C؟

StackOverflow https://stackoverflow.com/questions/4048312

  •  27-09-2019
  •  | 
  •  

سؤال

أنا أكتب بعض الوظائف المفيدة في C. واحدة منها isPalindrome().

كنت أحسب تحديد ما إذا كان الرقم هو palindrome أم لا ، يجب أن ...

  • احصل على جميع الأرقام في صفيف
  • تكرار من خلال اثنين من الفهارس - ابدأ واحدة في 0 وواحد إلى عدد الصفيف
  • زيادة/انخفاض الفهارس أثناء توصيل الصفيف أثناء مطابقة ، وإذا وصلت عدد الصفيف إلى 0 ، فلدينا palindrome (أي الانتهاء من جميع الأرقام).

خطرت لي...

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

هل هذا عمومًا كيف يتم ذلك؟

أنا أتعلم C بمفردي ، وعلى الرغم من أنني أستطيع معرفة متى يجمع الكود الخاص بي ولا يستغرق كل يوم للعمل عيون خبير لأخبرني إذا كنت على المسار الصحيح.

لذلك ، أي تحسينات أو اقتراحات على الكود الخاص بي؟

شكرا جزيلا!

هل كانت مفيدة؟

المحلول

عليك فقط أن تحلق أثناء i > j. مرة واحدة i <= j, ، أنت فقط تحقق من جميع الأحرف للمرة الثانية.

نصائح أخرى

على الرغم من استخدام مضمّن ++ و -- قد يبدو المشغلون في ما يلي ذكيين:

while (i >= 0 && places[j++] == places[--i]) { 
} 

سيكون الكود الخاص بك أسهل في القراءة إذا وضعت هؤلاء داخل جسم الحلقة:

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

وبهذه الطريقة ، لن يضطر قارئ الكود إلى التفكير في الآثار الجانبية المحتملة لتغيير قيم i و j ضمن الاختبار الشرطي. من المحتمل ألا يكون هناك تأثير قابل للقياس على سرعة الكود المترجم (على الرغم من أنه إذا كان الأداء مهمًا لهذه الوظيفة ، فيجب عليك التحقق من المترجم الخاص بك).

أيضا ، لديك خطأ حيث ستصل places[-1] لو i == 0.

سأستخدم فقط sprintf إلى "تحويل السلسلة إلى الأرقام":

char places[100];
sprintf(places, "%i", num);
i = strlen(places);

في جافا

static boolean isPalindrome(String p) {
    return p.equals(new StringBuilder(p).reverse().toString());
}

في C ++ و C

int IsPalindrome(char *string) {
    int bottom = 0, top;

    top = strlen(string) - 1;
    while(bottom < top && string[bottom] == string[top]) {
        ++bottom;
        --top;
    }
    return (bottom >= top ? 1:0);
}

ملاحظة ، تحتاج إلى الكتابة itoa وظيفة ، إذا كنت بحاجة إلى القيام بذلك لإدخال رقم. او استعمل ( حلقة الوصل ).

هذا هو ما يتم ذلك بشكل عام. هذا من شأنه أن يعمل أيضا لجميع القواعد وليس فقط 10.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top