196-algorithm
الدرس 20 من 20 في دورة ألغاز رياضية على Coddy.
إذا أخذنا 38، وعكسناه وجمعناه، 38 + 83 = 121، وهو عدد متناظر.
لا تنتج جميع الأرقام أعداداً متناظرة بهذه السرعة. على سبيل المثال،
- 37 + 73 = 110
- 110 + 11 = 121
أي أن الرقم 37 استغرق تكرارين للوصول إلى عدد متناظر.
مثال آخر، بدءاً من 249:
- 249+942=1191
- 1191+1911=3102
- 3102+2013=5115.
الأعداد المتناظرة مثل 11، 343، يُفترض أنها تصبح متناظرة في صفر من التكرارات.
خذ أي عدد صحيح موجب، واعكس أرقامه، وأضفه إلى العدد الأصلي. هذه هي عملية العكس والجمع. الآن كرر الإجراء مع المجموع الناتج حتى يتم الحصول على عدد متناظر. ينتج هذا الإجراء بسرعة أعداداً متناظرة لمعظم الأعداد الصحيحة.
يُسمى العدد الذي لا يشكل أبداً عدداً متناظراً من خلال عملية العكس والجمع بـ عدد ليتشريل. الأرقام القليلة الأولى التي لا يُعرف عنها أنها تنتج أعداداً متناظرة، وهي أرقام "ليتشريل المرشحة"، هي 196، 295، 394. [https://mathworld.wolfram.com/196-Algorithm.html]
التحدي
متوسطعلى الرغم من عدم تمكن أي شخص من إثبات ذلك حتى الآن، إلا أن بعض الأرقام في نظام العد العشري، مثل 196، لا تنتج أبداً عدداً متناظراً (palindrome). لغرض هذا التحدي، سنفترض أن الرقم هو رقم "ليشريل" (Lychrel) ما لم يثبت خلاف ذلك. كل رقم أقل من عشرة آلاف، فإنه إما (أ) يصبح عدداً متناظراً في أقل من خمسين تكراراً، أو (ب) لم يتمكن أحد، بكل القوة الحسابية الموجودة، من تحويله إلى عدد متناظر حتى الآن.
اكتب دالة isLychrel تستقبل عدداً صحيحاً موجباً أصغر من 10000، وتعيد عدد التكرارات التي يستغرقها ليصبح عدداً متناظراً.
أعد -1 في حال مرور أكثر من خمسين تكراراً.
جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "solution.h"
int main() {
int n;
if (scanf("%d", &n) != 1) n = 0;
int r = isLychrel(n);
printf("%d\n", r);
return 0;
}