zoukankan      html  css  js  c++  java
  • JZ-C-12

    剑指offer第十二题:打印1到最大的n个数,"大数问题"

      1 //============================================================================
      2 // Name        : JZ-C-12.cpp
      3 // Author      : Laughing_Lz
      4 // Version     :
      5 // Copyright   : All Right Reserved
      6 // Description : 剑指offer第十二题:打印1到最大的n个数,"大数问题"
      7 //============================================================================
      8 
      9 #include <iostream>
     10 #include <string.h>
     11 #include  <memory>//memory是C++空间配置器以及new delete定义的头文件,里面定义了空间配置器,new delete以及一些用于调用构造函数的函数。
     12 using namespace std;
     13 
     14 void PrintNumber(char* number);
     15 bool Increment(char* number);
     16 void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);
     17 
     18 void Print1ToMaxOfNDigits_1(int n) {
     19     if (n <= 0)
     20         return;
     21 
     22     char *number = new char[n + 1];
     23     memset(number, '0', n);
     24     number[n] = '';
     25 
     26     while (!Increment(number)) {
     27         PrintNumber(number);
     28     }
     29 
     30     delete[] number;
     31 }
     32 // 字符串number表示一个数字,在 number上增加1
     33 // 如果做加法溢出,则返回true;否则为false
     34 bool Increment(char* number) {
     35     bool isOverflow = false;
     36     int nTakeOver = 0;
     37     int nLength = strlen(number);
     38 
     39     for (int i = nLength - 1; i >= 0; i--) {
     40         int nSum = number[i] - '0' + nTakeOver;
     41         if (i == nLength - 1)
     42             nSum++;
     43 
     44         if (nSum >= 10) {
     45             if (i == 0)
     46                 isOverflow = true;
     47             else {
     48                 nSum -= 10;
     49                 nTakeOver = 1;
     50                 number[i] = '0' + nSum;
     51             }
     52         } else {
     53             number[i] = '0' + nSum;
     54             break;
     55         }
     56     }
     57 
     58     return isOverflow;
     59 }
     60 // ====================方法二====================
     61 void Print1ToMaxOfNDigits_2(int n) {
     62     if (n <= 0)
     63         return;
     64 
     65     char* number = new char[n + 1];
     66     number[n] = '';
     67 
     68     for (int i = 0; i < 10; ++i) {
     69         number[0] = i + '0';
     70         Print1ToMaxOfNDigitsRecursively(number, n, 0);
     71     }
     72 
     73     delete[] number;
     74 }
     75 
     76 void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index) {
     77     if (index == length - 1) {
     78         PrintNumber(number);//打印,结束一次循环
     79         return;
     80     }
     81 
     82     for (int i = 0; i < 10; ++i) {
     83         number[index + 1] = i + '0';//可以将整数转成字符
     84         Print1ToMaxOfNDigitsRecursively(number, length, index + 1);
     85     }
     86 }
     87 
     88 // ====================公共函数====================
     89 // 字符串number表示一个数字,数字有若干个0开头
     90 // 打印出这个数字,并忽略开头的0
     91 void PrintNumber(char* number) {
     92     bool isBeginning0 = true;
     93     int nLength = strlen(number);
     94 
     95     for (int i = 0; i < nLength; ++i) {
     96         if (isBeginning0 && number[i] != '0')
     97             isBeginning0 = false;
     98 
     99         if (!isBeginning0) {
    100 //            printf("%c", number[i]);
    101             cout << number[i];
    102         }
    103     }
    104 
    105 //printf("	");
    106     cout << " ";
    107 }
    108 
    109 // ====================测试代码====================
    110 void Test(int n) {
    111 //printf("Test for %d begins:
    ", n);
    112     cout << "Test for " << n << " begins:" << endl;
    113     Print1ToMaxOfNDigits_1(n);
    114 //    Print1ToMaxOfNDigits_2(n);
    115 
    116 //printf("Test for %d ends.
    ", n);
    117     cout << endl << "Test for " << n << " ends." << endl;
    118 }
    119 
    120 int main(int argc, char **argv) {
    121     Test(1);
    122     Test(2);
    123     Test(3);
    124     Test(0);
    125     Test(-1);
    126     return 0;
    127 }
  • 相关阅读:
    string与stringbuilder的区别
    Web负载均衡的几种实现方式
    JS 禁用鼠标右键
    JS中的!=、== 、!==、===的用法和区别。
    SQL Server Change Tracking
    关于更新发布CSS和JS文件的缓存问题
    Authorization in Cloud Applications using AD Groups
    英语学习[ZZ]
    我奋斗了18年,不是为了和你一起喝咖啡
    我奋斗了18年才和你坐在一起喝咖啡
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5551032.html
Copyright © 2011-2022 走看看