如何将长整数分成数千个输出?

时间:2016-05-23 04:08:17

标签: c

例如,如果我的号码为 390000 ,则需要打印为 390 000 。 如果我的号码为 1200000 ,则会打印为 1 200 000 等。

最初我考虑过将long long int赋值给一个字符串,然后为每个可能的字符串长度编写if语句,因为只有11种可能的长度,但这看起来真的很麻烦且不必要。

有更简单的方法吗?

6 个答案:

答案 0 :(得分:1)

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

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

请参阅a previous answer of mine to the question "convert astronomically large numbers into human readable form in C/C++"

答案 1 :(得分:0)

您可以通过启动足够大小的缓冲区来存储完整的long long数字(和分隔符),然后使用指针算法每隔3个数字插入一个分隔符,从而可以非常轻松地完成此操作。例如,MAXN32,您可以执行以下操作:

/** 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  =>  %s\n", 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

答案 2 :(得分:0)

使用Duff设备的另一种方式:

//tr[position() > 1][@class='row1' or not(starts-with(@class, 'excludeRow'))]

输出

#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 = '\0';
    return str;
}

int main(void)
{
    char str[32];

    printf("%s\n", sep(str, 1200000));
    return 0;
}

答案 3 :(得分:0)

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

#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);
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:-3)

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

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))

但我确信有更有效的方法可以解决您的问题。 ;)