سؤال

كيف يمكنني الحصول على رقم مثل 123456 وطباعةها على أنها 1 2 3 4 5 6?

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

المحلول

كما ذكر "Jamesdlin" في تعليقه ، فإن نهج GMAN سيعمل ، ومع ذلك ستحتاج إلى تخزينه في المخزن المؤقت للطباعة بالترتيب الصحيح (ستطبع خوارزميةه "6 5 4 3 2 1" للمدخلات 123456). في هذه المرحلة ، أود أن أقول أنه سيكون من الأسهل بكثير استخدام Sprintf كما هو مقترح في إجابته (إذا لم تكن هذه مهمة فئة خوارزمية بالطبع).

في رأيي ، فإن أبسط طريقة للقيام بذلك هي استخدام العودية ، وبهذه الطريقة يمكنك طباعة الأرقام بالترتيب الصحيح دون استخدام المخازن المؤقتة.

التنفيذ العودية بسيط للغاية:

void PrintfRecursivly(int number)
{
     if (number < 0) 
     {
       number *= -1;
       printf("- ");           
     }
     if (number > 10) 
     {
        PrintfRecursivly(number / 10);
        printf(" ");
     }

     printf("%d", number % 10);     
}

int main()
{
   int number = -78900456;
   PrintfRecursivly(number);

   return 0;
}

مدخل:

-78900456

انتاج:

- 7 8 9 0 0 4 5 6

تعديل: بفضل ستيف جيسوب الذي اقترح خوارزمية صحيحة للأعداد الصحيحة الإيجابية بينما كنت بعيدًا. لقد غيرت الطريقة أعلاه للطباعة بشكل صحيح لجميع ints (إيجابية وسلبية) ، دون المساحة الأخيرة.

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

نصائح أخرى

من المحتمل أن تكون أبسط طريقة للقيام بذلك (وإن لم تكن الأسرع) أولاً sprintf الرقم إلى مخزن مؤقت للسلسلة ، ثم حلقة من خلال المخزن المؤقت printf-ing شخصية واحدة ومساحة واحدة في وقت واحد.

لا توجد طريقة مدمجة للقيام بذلك ضمن المعيار printf التنسيق.

تتمثل الطريقة الشائعة في استخراج كل رقم ، ثم طباعة هذا الرقم. لن أعطيك الرمز ، لكنه النسخة المنفذة من:

int d; // your number

/* While `d` is not zero */
/* Modulus `d` with 10 to extract the last digit */
/* Print it, with your space */
/* Divide by 10 to remove the last digit */
/* Repeat */

هذا سيكون للخلف. سأترك الأمر كتمرين لإصلاح ذلك. (تلميح: في الحلقة ، ضع النتيجة في مجموعة من الشخصيات ، وعندما تنتهي من البدء في الفهرس الأخير من المصفوفة والطباعة للخلف.)


char buffer[50];
int myNum = 123456;
int n;
int i;

n = snprintf(buffer, sizeof buffer, "%d", myNum);

for (i = 0; i < n; i++)
{
    putchar(buffer[i]);
    putchar(' ');
}

putchar('\n');
int number = 123456;
char strNumber[64];
strNumber[0] = '\0';
sprintf_s(strNumber, "%d", number);
int i = 0;
while(strNumber[i] != '\0')
    printf("%c ", strNumber[i++]);

هذا يعمل فقط للأعداد الصحيحة غير الموقعة:

#include <stdio.h>
#include <math.h>

void print_number(unsigned int number) {
    int n = number, c = 0, p;
    while (n > 0) {
        n /= 10;
        c++;
    }
    for (n = c - 1; n >= 0; n--) {
        p = pow(10, n);
        printf("%d ", number / p);
        number -= number / p * p;
    }
    printf("\n");
}


int main(int argc, char *argv[]) {
    print_number(1);
    print_number(12);
    print_number(123);
    print_number(1234);
    print_number(12345);
    print_number(1234567);
    print_number(12345678);
    print_number(123456789);
    return 0;
}
#include <stdio.h>
int main ()
{
    int a, b, c, d, e;
    printf("Write a number of four figures\n");
    scanf("%d", &a);
    printf("Your number is:\n");

    b = (a - (a % 1000)) / 1000;
    c = ((a - (a % 100)) / 100) - b * 10;
    d = ((a - (a % 10)) / 10) - b * 100 - c * 10;
    e = (a - b * 1000 - c * 100 - d * 10);

    printf("%d\t%d\t", b, c);
    printf("%d\t", d);
    printf("%d", e);

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