剑指Offer面试题:11.打印1到最大的n位数
一、题目:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
二、不同的解法
2.1 不假思索的解法
最容易想到的办法是先求出最大的n位数,然后用一个循环从1开始逐个打印:
static void Print1ToMaxOfNDigitsSimple(int n)
{
int number = ;
int i = ; while (i < n)
{
number = number * ;
i++;
} for (i = ; i < number; i++)
{
Console.Write("{0}\t", i);
}
}
初看之下好像没有问题,但是其并没有考虑大数问题,有可能即使用整型(int)或长整型(long)都会溢出。
2.2 字符串模拟运算的解法
解决这个问题需要表达一个大数。最常用也是最容易的方法是用字符串或者数组表达大数。该算法的步骤如下:
Step1.把字符串中的每一个数字都初始化为'0';
Step2.每一次为字符串表示的数字加1,再打印出来;
static void Print1ToMaxOfNDigits(int n)
{
if (n <= )
{
return;
}
// memset(number,'0',n);
char[] number = new char[n + ];
for (int i = ; i < n; i++)
{
number[i] = '';
}
number[n] = '\0'; // Increment实现在表示数字的字符串number上增加1
while (!Increment(number))
{
// PrintNumber负责打印出number
PrintNumber(number);
} number = null;
} static bool Increment(char[] number)
{
bool isOverflow = false;
int takeOver = ;
int length = number.Length - ; for (int i = length - ; i >= ; i--)
{
int sum = number[i] - '' + takeOver;
if (i == length - )
{
sum++;
} if (sum >= )
{
if (i == )
{
// 标识已经溢出了
isOverflow = true;
}
else
{
sum -= ;
takeOver = ;
number[i] = (char)('' + sum);
}
}
else
{
number[i] = (char)('' + sum);
break;
}
} return isOverflow;
} static void PrintNumber(char[] number)
{
bool isBeginning0 = true; for (int i = ; i < number.Length; i++)
{
if (isBeginning0 && number[i] != '')
{
isBeginning0 = false;
} if (!isBeginning0)
{
Console.Write("{0}", number[i]);
}
} Console.Write("\t");
}
这里要注意的是:当数字不够n位的时候,我们在数字的前面补0,打印的时候这些补位的0不应该打印出来。
三、单元测试
3.1 封装测试入口
static void PrintTest(int n)
{
Console.WriteLine("Test for {0} begins:", n);
Print1ToMaxOfNDigits(n);
Console.WriteLine("Test for {0} ends.", n);
}
3.2 测试用例
static void Main(string[] args)
{
PrintTest();
PrintTest();
PrintTest();
PrintTest();
PrintTest(-); Console.ReadKey();
}
剑指Offer面试题:11.打印1到最大的n位数的更多相关文章
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 剑指Offer - 九度1515 - 打印1到最大的N位数
剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...
- 剑指offer——面试题11:旋转数组的最小数字
#include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...
- 剑指Offer面试题11(Java版):数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同一时候不须要考虑大数问题 1.自以为非常easy的解法: ...
- 剑指Offer:面试题11——数值的整数次方(java实现)
题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...
- 数值的整数次方(剑指offer面试题11)
实现函数 double Power(double base, int exponent),即乘方运算. 考虑问题 exponet < 0 , 可以转化为 1.0 / Power(base, -1 ...
- 剑指offer——面试题11:快速排序
#include"iostream" #include"random" using namespace std; /* void Swap(int &a ...
- 剑指offer面试题12-打印1到最大的n位数
题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
随机推荐
- Python学习笔记(3)
1.元组 元组的定义符号是() ,元素定义与列表完全一致.不同的是元组的内容是不可变的. 2.字典 字典里面的内容是无序的. 字典的元素组成形式是 key:value key的定义规则:key是不 ...
- Html和CSS布局技巧
单列布局水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元素的 ...
- NoSql数据库初探-mongoDB环境搭建
NoSQL数据库一改关系型数据库的缺点,更容易的集成.分布式.无模式.故障恢复等特点,正在一步步餐食关系型数据库的市场,作为一个与时俱进的码农了解一下新技术是必须的,尤其是在读了<NoSql精粹 ...
- [翻译]通过使用正确的search arguments来提高SQL Server数据库的性能
原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search ...
- asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .
Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...
- 一些关于HTML与CSS的总结与实际应用
//学习前端也快一年了,觉得有必要好好总结一下这一年来学过的知识.一些是前辈们的精华,文章最后会讲地址一一放出,若原作者有任何介意,请及时联系我删除. 关于DOCTYPE 1.DOCTYPE的作用是什 ...
- unity 角色旋转
using UnityEngine; using System.Collections; public class Triangle : MonoBehaviour { public float sp ...
- 【BZOJ】4245: [ONTAK2015]OR-XOR
题意 给定一个长度为\(n(1 \le n \le 500000)\)的序列\(a_i(0 \le a_i \le 10^{18})\),将它划分为\(m(1 \le m \le n)\)段连续的区间 ...
- browsersync实现网页实时刷新(修改LESS,JS,HTML时)
var gulp = require("gulp"), less = require("gulp-less"), browserSync = require(& ...
- codeforces 360 D - Remainders Game
D - Remainders Game Description Today Pari and Arya are playing a game called Remainders. Pari choos ...