نهج واحد ممكن:
#include <stdio.h>
char *digits[10] = {
"Zero", "One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight", "Nine"
};
int main() {
int num, digit;
long long tenth = 1;
printf("Please enter an integer: \n");
scanf("%d", &num);
while (tenth < num) {
tenth *= 10;
}
while (tenth > 1) {
tenth /= 10;
digit = num / tenth;
num %= tenth;
printf("%s ", digits[digit]);
}
return 0;
}
العرض التوضيحي. الآن للتفسيرات:
أولاً وقبل كل شيء ، ليس من المنطقي استخدام switch
هنا: الأرقام خطي إلى حد ما بطبيعتها ، وبالتالي يمكن تخزين أسمائهم (وينبغي) تخزينها في مجموعة من الأوتار بدلاً من ذلك (char *digits[10]
في هذا الرمز). بعد ذلك ، ستتمكن من الحصول على تسمية لرقم معين فقط عن طريق الوصول إلى هذه المجموعة باستخدام هذا الرقم كفهرس.
ثانياً ، تكمن المشكلة الرئيسية لهذا البرنامج في استخراج كل رقم من الإدخال بشكل منفصل. من الأسهل القيام بالانتقال من اليمين إلى اليسار (خذ نتيجة number % 10
, ، تعيين number / 10
إلى number
, ، كرر) ، ولكن هنا يجب القيام بالأشياء بطريقة أخرى - من اليسار إلى اليمين. لذلك هذا ما نفعله:
- حساب
tenth
- أول قوة من 10 أكبر من الرقم المحدد (على سبيل المثال ، إذا عملنا مع 546 ، سيكون 1000)
- في كل تكرار لاحق:
-- يقسم tenth
بحلول 10
- معالجة نتيجة تقسيم عدد صحيح number
بواسطة tenth
- تعيين مرة أخرى إلى number
ما تبقى من number
مقسوما tenth
في التكرار الأول tenth
يصبح 100 (1000/10) ، 546/100 يمنحك 5 (عدد صحيح مقسوما على عدد صحيح هو عدد صحيح ، يتم اقتطاع العشرية) ، 546 ٪ 100 يمنحك 46 - وهذا يتم تخزينه كرقم للتكرار الثاني.
في التكرار الثاني tenth
يصبح 10 (100/10) ، 46/10 يمنحك 4 ، 46 ٪ 10 يعطيك 6. الدورة التالية: 10/10 => 1 ، 6/1 => 6 ، 6 ٪ 1 => 0. SO tenth
أصبح مساوياً لـ 1 ، ويتم إيقاف الحلقة - حيث تتم معالجة جميع الأرقام.