一、题目:打印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();
}

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

剑指Offer面试题:11.打印1到最大的n位数的更多相关文章

  1. 剑指Offer:面试题12——打印1到最大的n位数(java实现)

    问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...

  2. 剑指Offer - 九度1515 - 打印1到最大的N位数

    剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...

  3. 剑指offer——面试题11:旋转数组的最小数字

    #include"iostream" using namespace std; int GetMinNumber(int *data,int len) { ,right=len-, ...

  4. 剑指Offer面试题11(Java版):数值的整数次方

    题目:实现函数double Power(double base,int exponent),求base的exponent次方.不得使用库函数,同一时候不须要考虑大数问题 1.自以为非常easy的解法: ...

  5. 剑指Offer:面试题11——数值的整数次方(java实现)

    题目描述: 实现函数double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时不需要考虑大数问题 思路:本题的重点考察内容是 ...

  6. 数值的整数次方(剑指offer面试题11)

    实现函数 double Power(double base, int exponent),即乘方运算. 考虑问题 exponet < 0 , 可以转化为 1.0 / Power(base, -1 ...

  7. 剑指offer——面试题11:快速排序

    #include"iostream" #include"random" using namespace std; /* void Swap(int &a ...

  8. 剑指offer面试题12-打印1到最大的n位数

    题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ...

  9. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  10. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

随机推荐

  1. AutoMapper实现自动CreapMap

    标题是个噱头,完全不写代码自动是不现实的,只是简化了CreateMap.方法也是很粗糙的,看看吧. 我想在使用AutoMapper的时候最恶心的一定是写了一个Profile,里边有n行 Mapper. ...

  2. Dev Cpp 输出中文字符问题

    最近 c++ 上机作业,vc++6.0 挂了没法用,只好用 Dev Cpp 先顶替一下,然而在遇到输出中文字符的时候出现了乱码的情况,但这种情况又非常诡异.于是简单了解了一下写成此博客. [写在前面] ...

  3. 收集常用的.net开源项目

    Json.NET http://json.codeplex.com/ Json.NET是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Lin ...

  4. adv

    1. 对产品质量的认知理念,不仅是是确保没问题,而是通过自身与团队的价值提升产品的质量.潜在问题,竞类产品用户体验,bug产生分析图,流程控制 2. 责任心特质,正能量,热情激情,并且能感染团队成员和 ...

  5. SPOJ DISUBSTR ——后缀数组

    [题目分析] 后缀数组模板题. 由于height数组存在RMQ的性质. 那么对于一个后缀,与前面相同的串总共有h[i]+sa[i]个.然后求和即可. [代码](模板来自Claris,这个板子太漂亮了) ...

  6. 如何获取ResultSet的行数和列数

    当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数.我们知道它的列数可以通过resultSet.getMetaData().ge ...

  7. Linux 用户添加sudo 权限

    编辑/etc/sudoers 搜索root 添加 账号 ALL=(ALL) ALL

  8. css的padding

  9. Android -- PopupWindow(其中嵌套ListView 可以被点击)

    1. 效果图

  10. 一篇笔记带你快速掌握面向对象的Javascript(纯手打)

    /** * 创建对象 */ //1.工厂模式 //特点: //创建的对象无法识别其对象类型,不支持instanceof等判断方法,无法标识不同的对象 function createObj(name,s ...