[英]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' : ',');
}
}
}
#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.