如何将一个长整数分成数千个进行输出

  • 本文关键字:千个 输出 长整数 一个 c
  • 更新时间 :
  • 英文 :


例如,如果我的数字为 390000,则需要打印为 390 000如果我的数字为 1200000,它将打印为 1 200 000 等。

最初我想将长 long int 分配给一个字符串,然后为每个可能的字符串长度编写 if 语句,因为只有 11 个可能的长度,但这似乎真的很麻烦和不必要的。

有没有更简单的方法?

如果您使用的是 POSIX 系统,并且您的某个区域设置使用空格作为数字分组符号,请在转换说明符中使用撇号 ( ' printf())。

setlocale(LC_NUMERIC, "SOMETHING");
printf("%'d", 345678); // 345 678

请参阅我之前对"在 C/C++ 中将天文数字转换为人类可读形式"问题的回答

您可以通过从大小足以存储完整long long数字(和分隔符)的缓冲区开始,然后使用指针算术每隔 3 个数字插入一个分隔符,您可以相当轻松地做到这一点。例如,在MAXN 32 的地方,您可以执行以下操作:

/** separate long long value every 3rd char into 's' */
char *sepnumber (char *s, long long val)
{
    char numstr[MAXN] = "";
    char *p = s + MAXN - 2;
    size_t idx = 0, len = 0;
    len = sprintf (numstr, "%lld", val);
    while (len--) {
        if (idx++ == 3) {
            idx = 1;
            *p-- = ' ';
        }
        *p = numstr[len];
        if (len) p--;
    }
    for (idx = 0; *p; p++, idx++) s[idx] = *p; /* copy to s */
    s[idx] = *p;    /* nul-terminate */
    return s;
}

一个简单的例子是:

#include <stdio.h>
#include <stdlib.h>
#define MAXN 32
char *sepnumber (char *s, long long val);
int main (int argc, char **argv) {
    long long int lv = argc > 1 ? strtoll (argv[1], NULL, 10) : 1931583282;
    char fmtnum[MAXN] = "";
    printf (" %lld  =>  %sn", lv, sepnumber (fmtnum, lv));
    return 0;
}
/** separate long long value every 3rd char into 's' */
char *sepnumber (char *s, long long val)
{
    char numstr[MAXN] = "";
    char *p = s + MAXN - 2;
    size_t idx = 0, len = 0;
    len = sprintf (numstr, "%lld", val);
    while (len--) {
        if (idx++ == 3) {
            idx = 1;
            *p-- = ' ';
        }
        *p = numstr[len];
        if (len) p--;
    }
    for (idx = 0; *p; p++, idx++) s[idx] = *p; /* copy to s */
    s[idx] = *p;    /* nul-terminate */
    return s;
}

示例使用/输出

$ ./bin/sepnum
 1931583282  =>  1 931 583 282
$ ./bin/sepnum 2212
 2212  =>  2 212

这是一个没有任何废话的简单版本。可能还有更有效的方法,但如果是这样,它们不包括字符串处理或浮点数。

#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>
static void print_number (uint32_t n)
{
  static bool remove_zeroes = true;
  if(remove_zeroes)
  {
    remove_zeroes = false;
    printf("%" PRIu32 " ", n);
  }
  else
  {
    printf("%.3" PRIu32 " ", n);
  }
}

void print_number_with_spaces (uint32_t n)
{
  bool remove_zeroes = true;
  while(n > 1000)
  {
    uint32_t tmp = n;
    uint32_t subtract = 1;
    while(tmp > 1000)
    {
      tmp /= 1000;
      subtract *= 1000;
    }
    print_number(tmp);
    if(subtract >= 1000)
    {
      n -= tmp*subtract;
    }
  } 
  print_number(n);
}

int main(int argc, char* argv[]) 
{
  print_number_with_spaces(1200000);
}

使用分隔数千个位置的空格进行打印的一种简单方法是使用递归。 也适用于负值。

void print_1000(long long x) {
  long long msgroups = x / 1000;
  int lsgroup = x % 1000;
  if (msgroups) {
    print_1000(msgroups);
    char separator = ' ';  // adjust as deisred
    printf("%c%03d", separator, abs(lsgroup));
  } else {
    printf("%d", lsgroup);
  }
}

示例用法

int main(void) {
  print_1000(0); puts("");
  print_1000(-1); puts("");
  print_1000(LLONG_MAX); puts("");
  print_1000(LLONG_MIN); puts("");
  return 0;
}

输出

0
-1
9 223 372 036 854 775 807
-9 223 372 036 854 775 808

使用达夫设备的另一种方式:

#include <stdio.h>
static char *sep(char *str, long long value)
{
    char tmp[32];
    char *p = tmp;
    char *q = str;
    int len;
    len = snprintf(tmp, sizeof tmp, "%lld", value);
    if (*p == '-') { // Support for negatives
        *q++ = *p++;
        len--;
    }
    /*
     * Consider 5 mod 3
     * len % 3 is evaluated only once. E.g. 5 % 3 = 2
     * jumps into the middle of the loop (in this case to "case 2:")
     * case 2 and case 1 are evaluated
     * loops until NUL is reached evaluating all cases
     */
    switch (len % 3) do {
        *q++ = ' ';
        case 0: *q++ = *p++;
        case 2: *q++ = *p++;
        case 1: *q++ = *p++;
    } while (*p);
    *q = '';
    return str;
}
int main(void)
{
    char str[32];
    printf("%sn", sep(str, 1200000));
    return 0;
}

输出

1 200 000
我想

出的一个快速解决方案是:

output = []
number = '1209873'
aux = reversed(list(number))
counter = 0
for digit in aux:
    output.append(digit)
    counter += 1
    if counter % 3 == 0:
        output.append(' ')
spaced_number = reduce(lambda x, y: x + y, reversed(output))

但我相信有更有效的方法来解决你的问题。 ;)

最新更新