打印从1到最大的n位数

题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999

陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或long long都会溢出,故使用字符串来模拟数字加法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print_cur_number(char *s)
{
    char *p = s;
    while( *p != ‘\0‘ )
    {
        if( *p == ‘0‘ ) // 找到第一个非0数字的位置
            p++;
        else
            break;
    }
    printf("%s\n",p);
}

int increase_one(char *s)
{
    int i;
    int len = strlen(s);
    int carry = 0; // 进位标志
    int over = 0; // over=1, 表示当前值已经是n位数的最大值了, 再+1将成为n+1位数

    for( i=len-1; i>=0; i-- )
    {
        int sum = s[i]-‘0‘+carry;
        if( i == len-1 )
            ++sum; // 第一次循环, 最低位+1
        if( sum>=10 ) // 当前位>=10, 需要往高一位进一
        {
            if( i==0 ) // 发生最高位的进位,说明当前值(未+1之前)已经是n位数的最大值了
                over = 1;
            else // 非最高位的进位
            {
                sum -= 10;
                s[i] = ‘0‘+sum;
                carry = 1;
            }
        }
        else // 当前值+1之后, 未发生进位, 结束循环
        {
            s[i] = sum +‘0‘;
            break;
        }
    }
    return over;
}

void print_to_max_n_digit(int n)
{
    char *s = malloc(n+1);
    memset(s, ‘0‘, n);
    s[n] = ‘\0‘;

    if( n<=0 )
        return ;

    while( !increase_one(s) )
    {
        print_cur_number(s);
    }
    free(s);
}

int main(void)
{
    int n;
    printf("打印1-最大的n位数,请输入n: ");
    scanf("%d",&n);
    print_to_max_n_digit(n);

    return 0;
}

打印从1到最大的n位数,布布扣,bubuko.com

时间: 2024-10-15 20:11:00

打印从1到最大的n位数的相关文章

LeetCode | 面试题17. 打印从1到最大的n位数【剑指Offer】【Python】

LeetCode 面试题17. 打印从1到最大的n位数[剑指Offer][Easy][Python][遍历] 问题 力扣 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 说明: 用返回一个整数列表来代替打印 n 为正整数 思路 Python3代码 class Solution: def printNumbers(self, n: int

剑指offer——打印从1到最大的n位数

因为unsigned int甚至unsigned long类型不一定能表示很大的n位数,它们的表示范围是一定的,所以可以使用字符串来存储,并打印 bool Incerment(char*& str,int n)//每次调用这个函数都会对字符串进行数值的加1 {     int index = n-1;     int tmp = str[index] - '0' + 1;     int offset = 0;     while (index>0){//如果index==0则表示已经超出了

剑指Offer之打印从1到最大的n位数

基本思路 第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位.因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止.代码如下: public class Print1ToMaxOfDigits { public static void main(String[] args) { Scanner sc = new Scanner(System.i

【剑指offer】17、打印从1到最大的n位数

题目 输入数字n,按顺序打印从1到最大n位的十进制数.比如输入3,打印1到999. 思路 输入的数字可以很大,可以是33,65,这样的话int和long long都不能满足题目要求,所以这是一个大数问题. 大数问题经常用字符串来解决 我们当然可以用字符串来模拟加法 最方法的方法应该是做一个n位的全排列,每位可以取0~9 void Print1toMaxOfNDigits(int n){ if (n <= 0) return; char* number = new char[n+1]; numbe

剑指offer:打印从1到最大的n位数

题目:输入数字n,按顺序从1打印到最大的n位十进制数.例如,输入3,则打印1, 2, 3, ..., 999 def printToMaxOfNDigits(n): """ 打印1, 2, ..., 99999(n个9) 可以从1开始然后用大数加法加到n个9,也可以使用递归方法实现 """ def helper(idx): # 递归出口就是设置完最后一位 if idx == n - 1: for j in range(n): if number[

剑指offer[面试题17:打印从1到最大的n位数]

题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的三位数999. 思路: 隐藏考点:当输入的n很大时,用整型(int)或者长整型(long int)求最大的n位数都会溢出.也就是需要考虑大数问题. 用递归实现全排列,数字(用字符串容器装)的每一位都是0~9中的一个数,然后设置下一位.递归结束的条件是已经设置了数字的最后一位. class Solution { public: void PrintMaxOfDigits(int n){ if (n <

剑指offer——面试题17:打印从1到最大的n位数

用字符串模拟加法: 1 #include"iostream" 2 #include"string.h" 3 using namespace std; 4 5 bool AddOne(char *number,int n); 6 void PrintNumber(char *number,int n); 7 8 void Print1ToN(int n) 9 { 10 if(n<=0) 11 return; 12 char *number=new char[n+

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

算法题:打印1到最大的n位数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 今天看到剑指offer上的第12题,题目例如以下: 输入数字n.按顺序打印出从1到最大的n位十位数. 比方输入3,则打印出1,2,3,...,999. 当我看到这个题目的时候.第一感觉就是用递归,为什么呢?首先得从我们的一个实际数字出发,比方123.我们对数字加1,实际上分为例如以下两个步骤: 步骤1:最低位加1: 步骤2:若发生进位,则向更高位传播该进位的影响(这也是递归的所在). 在完毕这个算法题之前.我想插一句"细节决定成败!"