题目描写叙述:

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

分析描写叙述:

首先想到的是先计算出最大的n位数是多少,然后用一个循环从1開始打印直到最大的n位数。

void Print1ToMaxOfNDigits_1(int n)
{
if(n <= 0)
return; int i = 0;
int number = 1; while(i++ < n){
number *= 10;
} for(i = 1; i < number; ++i)
printf("%d\t", i);
}

注意上面的代码段,由于题目仅仅是给出了n位数。但没有说明是这个n位数究竟有多大,这是一个大数问题。

比方n>32之后。就会出现溢出问题。因此必须考虑大数问题。选用字符串来表达大数,即字符串中每一个字符都是0到9之间的某一个字符。用来表示数字中的一位。

由于数字最大是n位的。因此须要一个长度为n+1的字符串(字符串中最后一个是结束符'\0')。

当实际数字不够n位的时候,在字符串的前半部分补0。

首先把字符串中的每个数字都初始化为'0'。然后每一次为字符串表示的数字加1,再打印出来。因此须要做两件事:1、在字符串表达的数字上模拟加法;2、把字符串表达的数字打印出来。

void Print1ToMaxOfNDigits_1(int n)
{
if(n <= 0)
return; char number[n+1];
memset(number, '0', n);
number[n] = '\0'; while(!Increment(number)){ /*在字符串表达的数字上模拟加法*/
PrintNumber(number); /*把字符串表达的数字打印出来*/
} return;
}
#define false 0
#define true (!false) typedef int Status; Status Increment(char *number)
{
Status isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number); for(int i = nLength - 1; i>= 0; i--){
int nSum = number[i] - '0' + nTakeOver;
if(i == nLength - 1)
nSum++; if(nSum >= 10){
if(i == 0)
isOverflow = true;
else{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}else{
number[i] = '0' + nSum;
break;
}
} return isOverflow;
}

上面的函数,须要知道何时停止number上加1,即什么时候到了最大的n位数。

能够比較在每次递增后与最大数做比較(用strcmp函数),但复杂度是O(n)。当到达最大数时,假设继续加1操作,最高位就会溢出。

因此在每一次添加1之后高速推断是不是到了最大的n位数是本题小陷阱。它实现了用O(1)时间推断是不是已经到了最大的n位数。

void PrintNumber(char *number)
{
Status isBeginning0 = true;
int nLength = strlen(number); for(int i = 0; i < nLength; ++i){
if(isBeginning0 && number[i] != '0')
isBeginning0 = false;
if(!isBeginning0)
printf("%c", number[i]);
} printf("\t");
}

在输出number时,要注意对于比較小的数,如093。我们仅仅须要输出93。而不是输出093。

 注意:假设面试题是关于n位的整数而且没有限定n的取值范围,或者是输入随意大小的整数,那么这个题目非常有可能是须要考虑大数问题的。字符串是一个简单、有效的表示大数的方法。

【剑指offer】打印1到最大的n位数的更多相关文章

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

    题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或 ...

  2. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  3. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  4. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  5. 【剑指offer】从上向下打印二叉树

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26089165 剑指offer上的第23题,实际上就是考察二叉树的层序遍历,详细思想能够參考 ...

  6. 【剑指offer】打印1到最大的n数字

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25562105 剑指offer第12题.九度OJ測试通过. 题目描写叙述: 给定一个数字N, ...

  7. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  8. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

  9. 剑指offer得意之作——顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3 ...

  10. 剑指offer面试题5 从头到尾打印链表(java)

    注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...

随机推荐

  1. LeetCode(39) Combination Sum

    题目 Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C w ...

  2. WIN10配置MAVEN

    添加新的系统环境变量M2_HOME, 并设置其值为你安装的目录MAVEN_HOME=D:\Softwares\apache-maven-3.2.2. 更新系统PATH 变量, 添加;%M2_HOME% ...

  3. java 协程框架quasar gradle配置

    https://github.com/puniverse/quasar-gradle-template/blob/master/gradle/agent.gradle 1.将其中的"-jav ...

  4. windows下的host工作原理

    在Window系统中有个Hosts文件(没有后缀名),在Windows98系统下该文件在Windows目录,在Windows2000/XP系统中位于C:\Winnt\System32\Drivers\ ...

  5. 【LeetCode】Jewels and Stones(宝石与石头)

    这道题是LeetCode里的第771道题. 题目要求: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝 ...

  6. D. Frequent values

    D. Frequent values Time Limit: 3000ms Case Time Limit: 3000ms Memory Limit: 131072KB   64-bit intege ...

  7. BNUOJ 4215 最长公共连续子序列

    最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class ...

  8. python3--__call__拦截调用

    __call__拦截调用 当实例调用时,使用__call__方法.不,这不是循环定义:如果定义了,Python就会为实例应用函数调用表达式运行__call__方法.这样可以让类实例的外观和用法类似于函 ...

  9. [android开发篇] [应用组件]Intent 和 Intent 过滤器

    https://developer.android.com/guide/components/intents-filters.html Intent 是一个消息传递对象,您可以使用它从其他应用组件请求 ...

  10. Method for Estimating the Number of Concurrent Users

    1. Formula for Estimating the Average Number of Concurrent users We begin by defining what the numbe ...