打印1到最大的n位数

输入:非负整数n。

输出:如输入3,则输出1~999。

基本的方法涉及到大数,通过用字符串模拟加法运算。

知识点:判断溢出

逆序打印字符串

基本的代码如下

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
size_t inc_num(char* num_str, size_t len) {
  int i = 0;
  int carrier = 0;
  num_str[0] += 1;
  do {
    if (num_str[i] > 9) {
      carrier = 1;
      num_str[i] -= 10;
    } else {
      carrier = 0;
    }
    if (++i > len) {
      break;
    }
    num_str[i] += carrier;
  } while (carrier);
  return i;
}
void put_num(const char* num_str, size_t len) {
  // ignore high zero
  while (len && !num_str[len - 1]) {
    --len;
  }
  while (len) {
    putchar(num_str[--len] + '0');
  }
  putchar('\n');
}
void print_num(size_t len) {
  if (len <= 0) {
    return;
  }
  char* num_str = (char*)malloc(len);
  if (!num_str) {
    return;
  }
  memset(num_str, 0, len);
  size_t curr_len = 0;
  while ((curr_len = inc_num(num_str, len)) <= len) {
    put_num(num_str, len);  
  }
  free(num_str);
}
int main(int argc, char *argv[]) {
  if (argc != 2) {
    printf("usage ./instance num\n");
    return -1;
  }
  int num = atoi(argv[1]);
  print_num(num);
  return 0;
}

 

posted @ 2013-08-31 12:14  westfly  阅读(218)  评论(0编辑  收藏  举报