• 打印1到最大的n位数


    题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999。

     1 /* 解法1:
     2     此题应该注意大数的情况。
     3     因此用字符串来模拟大数。
     4     具体思路:首先把字符串的每一个数字都初始化为‘0’,
     5     然后每一次为字符串表示的数字加1,    在打印出来。
     6     即:1、在字符串表示的数字上模拟加法;Increment(n)
     7         2、把字符串表示的数字打印出来。PrintNumber(n)
     8 */
     9 #include <iostream>
    10 using namespace std;
    11 
    12 void PrintNumber(char* n){
    13     int len = strlen(n);
    14     int i = 0;
    15     while( i < len && n[i] == '0' )    // 不打印前导0
    16         i++;
    17     bool flag = false;
    18     while(i < len){
    19         cout << n[i++];
    20         flag = true;
    21     }
    22     if (flag)        // 保证当数字为0时,不输出空格
    23         cout << endl;
    24 }
    25 
    26 bool Increment(char* n){
    27     bool isOverflow = false;
    28     int len = strlen(n);
    29     int carry = 0;
    30     for (int i = len-1; i >= 0; i--){
    31         int nSum = n[i] - '0' + carry;
    32         if (i == len-1)
    33             nSum++;
    34         if (nSum >= 10){
    35             if (i == 0)
    36                 isOverflow = true;
    37             else{
    38                 nSum -= 10;
    39                 carry = 1;
    40                 n[i] = '0' + nSum;
    41             }
    42         }
    43         else{    // 无需再进位
    44             n[i] = '0' + nSum;
    45             break;
    46         }
    47     }
    48     return isOverflow;
    49 }
    50 
    51 void Print1ToMaxOfNDigits(int n){
    52     if (n <= 0)
    53         return;
    54     char *number = new char[n+1];
    55     memset(number, '0', n);
    56     number[n] = '';
    57 
    58     while(!Increment(number))    // number+1
    59         PrintNumber(number);    // 打印number
    60     delete []number;
    61 }
    62 
    63 int main(){
    64     Print1ToMaxOfNDigits(2);
    65     return 0;
    66 }
     1 /* 解法2:
     2     解法1的代码相对较长。可以换一种思路来考虑该问题。
     3     如果在数字前面补0的话,就会发现n位所有十进制数其实就是n个从0到9的全排列。
     4     即,把数字的每一位都从0~9排列一边,就得到所有的十进制数。
     5     只是在打印时,数字排在前面的0不打印出来而已。
     6 */
     7 #include <iostream>
     8 using namespace std;
     9 
    10 void Print1ToMaxOfNDigitsRecursively(char *n, int len, int index){
    11     if (index == len-1){        // 已设置完所有的n位
    12         PrintNumber(n);        // 同解法1
    13         return;
    14     }
    15     for (int i = 0; i < 10; i++){
    16         n[index+1] = '0' + i;
    17         Print1ToMaxOfNDigitsRecursively(n, len, index+1);    // 递归打印len位数字
    18     }
    19 }
    20 
    21 void Print1ToMaxOfNDigits(int n){
    22     if (n <= 0)
    23         return;
    24     char* number = new char[n+1];
    25     memset(number, '0', n);
    26     number[n] = '';
    27 
    28     for (int i = 0; i < 10; i++){
    29         number[0] = '0' + i;
    30         Print1ToMaxOfNDigitsRecursively(number, n, 0);    // 递归打印n位数字
    31     }
    32     delete[] number;
    33 }
    34 
    35 int main(){
    36     Print1ToMaxOfNDigits(9);
    37     return 0;
    38 }
  • 相关阅读:
    对弈类游戏的人工智能(5)--2048游戏AI的解读
    对弈类游戏的人工智能(4)--游戏AI的落地
    对弈类游戏的人工智能(3)--博弈树优化
    对弈类游戏的人工智能(2)--学习算法
    java.awt.headless 模式
    SpringBoot启动过程分析
    SpringBoot入门之内嵌Tomcat配置
    git tag的用法
    SpringBoot程序远程debug
    SpringBoot入门之分散配置
  • 原文地址:https://www.cnblogs.com/qianmacao/p/4866386.html
Copyright © 2020-2023  润新知