簡體   English   中英

C中的數字輸出

[英]Digit output in C

大家好,我是編碼初學者,我試圖弄清楚如何輸出所有數字。 例如數字158中的數字1、5、8、15、58、158。 抱歉英語不好。

我嘗試過一些東西,但它不適用於所有數字,而且我相信必須有更好的方法來編碼它而沒有所有的 while 循環。

    #include <stdio.h>

int main(){
    long num = 5025;
    int num1=num ,num2= num, num3=num;
   
    while(num1 !=0)
    {
        int digit = num1 % 10;
        num1 = num1/10;
        printf("%d\n", digit);
    } 
    while(num2 >10)
    {
        
        int digit = num2 % 100;
        
        num2 = num2 / 10;
                
        printf("%.2d\n", digit);
    }
    while(num3 >100)
    {
        
        int digit = num3 % 1000;
        
        num3 = num3 / 10;
                
        printf("%.3d\n", digit);
    }
    
    return 0;
}

可以打印到一個字符串,然后發布它的各種組合

  long num = 158;
  char buf[25];
  snprintf(buf, sizeof buf, "%ld", num);

  for (int first = 0; buf[first]; first++) {
    for (int last = first; buf[last]; last++) {
      int width = last - first + 1;
      printf("%.*s\n", width, buf + first);
    }
  }

輸出

1
15
158
5
58
8

根據值的不同,您可能會得到重復。 OP 尚未定義在這種情況下該怎么做。


對於純數學方法,我會使用recursion ,但我預計此時這超出了 OP 的能力。

這是為沒有花哨的 printf 格式的任何unsigned int數字打印它的函數。 它還按從最短到最長的順序打印:

void print(unsigned num)
{
    char nums[20];
    size_t len;

    len = sprintf(nums, "%u", num);

    for(size_t seql = 1; seql <= len; seql++)
    {
        for(size_t ndig = 0; ndig < len - seql + 1; ndig ++)
        {
            for(size_t dig = 0; dig < seql; dig++)
            {
                printf("%c", nums[dig + ndig]);
            }
            printf("%c", seql == len ? '\n' : ',');
        }
    }
}

int main(void)
{
    print(15895678);
}

或者沒有字符串:

char getNthDigit(unsigned num, size_t digit, size_t len)
{
    size_t pos = len - digit;
    while(--pos) num /= 10;
    return num % 10;
}

size_t getNdigits(unsigned num)
{
    size_t count = 0;
    while(num) 
    {
        count++;
        num /= 10;
    }
    return count;
}


void print(unsigned num)
{
    char nums[20];
    size_t len;

    len = num ? getNdigits(num) : 1;

    for(size_t seql = 1; seql <= len; seql++)
    {
        for(size_t ndig = 0; ndig <= len - seql; ndig ++)
        {
            for(size_t dig = 0; dig < seql; dig++)
            {
                printf("%c", '0' + getNthDigit(num,dig + ndig, len));
            }
            printf("%c", seql == len ? '\n' : ',');
        }
    }
}

https://godbolt.org/z/Wa8nKns9E

#include <stdio.h>

int main(void) {
    int num = -158;
    char text[12];
    sprintf(text, "%d", abs(num));
    
    for(int w=0; w<strlen(text);   ++w)
    for(int s=0; s<strlen(text)-w; ++s)
    printf("%.*s\n", w+1, text+s);
    
    return 0;
}

來自IDEOne

輸出

Success #stdin #stdout 0s 5632KB
1
5
8
15
58
158

我的看法,沒有字符串,復雜性稍低。 如果數字有 0 位,它將打印右側數字的重復項。

#include <stdio.h>

int main(void)
{
    int digits[64]; // size of array must cover however many digits are in long max
    int numDigits = 0;
    long num = 15876;

    // populate array with each digit
    while (num)
    {
        digits[numDigits++] = num % 10;
        num /= 10;
    }

    // start at the end of the array (since digits are loaded in it backwards)
    for (int first=numDigits-1; first>=0; first--)
    {
        int temp = digits[first];
        printf("%d\n", temp);  // print the initial condition
        for (int last=first-1; last>=0; last--)
        {
            // continue to build temp by multiplying by 10 and adding the next digit
            temp = (temp * 10) + digits[last];
            // could easily put the output in a comma-separated list if that's needed
            printf("%d\n", temp);
        }
    }
}

輸出

1
15
158
1587
15876
5
58
587
5876
8
87
876
7
76
6

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM