题目12 打印1到最大的n位数
/////////////////////////////////////////////////////////////////////////////////////
// 2.打印1到最大的n位数
// 2.1 方法一:当N很大时,会有溢出问题!!!!
void Print1ToMaxOfDigits_1(int iLen)
{
int iNumber = 1;
while (iLen > 0)
{
iNumber *= 10;
iLen--;
} for (int i = 1; i < iNumber; i++)
{
if (i % 20 == 0 && i != 0)
{
putchar(10);
}
printf("%3d ", i);
}
putchar(10);
} // 2.2 方法二:字符串上模拟数字加法
bool Increment(char* pszBuff)
{
bool bOverFlow = false;
int iTakeOver = 0; // 进位
int iLen = strlen(pszBuff); for (int i = iLen - 1; i >= 0; i--)
{
int iSum = pszBuff[i] - '0' + iTakeOver; // 这里什么作用??? --> ++功能???
if (i == iLen - 1)
{
iSum++;
} if (iSum >= 10)
{
// 退出循环条件!!!
if (i == 0)
{
bOverFlow = true;
}
else
{
iSum -= 10;
iTakeOver = 1;
pszBuff[i] = '0' + iSum;
}
}
else
{
pszBuff[i] = '0' + iSum;
break;
}
} return bOverFlow;
} void PrintNumber(char* pszBuff)
{
bool bZero = true;
int iLen = strlen(pszBuff); for (int i = 0; i < iLen; i++)
{
// 不打印字符串前面的0
if (bZero && pszBuff[i] != '0')
{
bZero = false;
} if (!bZero)
{
printf("%c", pszBuff[i]);
}
}
} void Print1ToMaxOfDigits_2(int iLen)
{
if (iLen <= 0)
{
return;
} char* pszBuff = new char[iLen + 1];
memset(pszBuff, '0', iLen);
pszBuff[iLen] = '\0';
int iPrintLen = 0; while (!Increment(pszBuff))
{
PrintNumber(pszBuff);
printf(" ");
iPrintLen++;
if (iPrintLen % 20 == 0 && iPrintLen != 0)
{
putchar(10);
}
} putchar(10); // 释放内存
delete[] pszBuff;
pszBuff = NULL; } // 2.3 把问题转换成数字排列的解法
static int s_PrintNum = 0;
void Print1ToMaxOfDigitsRecursion(char* pszBuff, int iLen, int iIndex)
{
if (iIndex == iLen - 1)
{
PrintNumber(pszBuff);
printf(" ");
s_PrintNum++;
if (s_PrintNum % 20 == 0)
{
putchar(10);
} return;
} for (int i = 0; i < 10; i++)
{
pszBuff[iIndex + 1] = i + '0';
Print1ToMaxOfDigitsRecursion(pszBuff, iLen, iIndex + 1);
}
} void Print1ToMaxOfDigits_3(int iLen)
{
if (iLen <= 0)
{
return;
} char* pszBuff = new char[iLen + 1];
pszBuff[iLen] = '\0'; for (int i = 0; i < 10; i++)
{
pszBuff[0] = i + '0';
Print1ToMaxOfDigitsRecursion(pszBuff, iLen, 0);
} putchar(10); // 释放内存
delete[] pszBuff;
pszBuff = NULL;
} void Print1ToMaxOfDigitsTestFunc()
{
cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc Start -------------->" << endl;
int iNum = 2; cout << "方法一: " << endl; Print1ToMaxOfDigits_1(iNum); cout << "方法二: " << endl;
Print1ToMaxOfDigits_2(iNum); cout << "方法三: " << endl;
Print1ToMaxOfDigits_3(iNum); cout << "\n\n --------------- Print1ToMaxOfDigitsTestFunc End -------------->" << endl; }
题目12 打印1到最大的n位数的更多相关文章
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 面试题12:打印1到最大的n位数
// 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- 《剑指offer》面试题12 打印1到最大的n位数 Java版
书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...
- 12 打印1到最大的n位数
输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...
- 剑指Offer面试题:11.打印1到最大的n位数
一.题目:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二.不同的解法 2.1 不假思索的解法 最容易想到的办 ...
- 剑指Offer面试题:9.打印1到最大的n位数
一 题目:打印1到最大的n位数 题目:输入数字n,按顺序打印从1到最大的n位十进制.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二 不考虑大数解法 // 打印从1到最大的n位数 voi ...
- 每天一道算法题(15)——打印1到最大的n位数
题目: 打印1到最大的n位数.如n=4,打印1-9999. 思路: 由于直接使用循环会导致int或者long long都不够存储.因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法. ...
随机推荐
- HDOJ->考新郎(sdut1021)
考新郎 Problem Description 在一场盛大的集体婚礼中,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的: 首先,给每 ...
- Java Collection Framework 备忘点
最顶端是两个接口,集合和映射—— Collection<T> / Map<K, V> List 列表 保持插入顺序 ArrayList 擅长随机读 LinkedList ...
- Reids入门介绍
一.入门概述 1.是什么? Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式 ...
- java代码连接oracle数据库的方法
oracle连接数据库的方式和mysql是大同小异的,主要的困难点在于oracle的数据库驱动包和依赖只有官方提供,如果你是用maven添加依赖的话,需要自己从官网下载jar包安装到你本地的maven ...
- java使用jconsole查看java程序运行(jmx原理)
在JVM启动参数上加上 java -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.aut ...
- tomcat加载java程序非常慢解决
解决: 下面两种方式都要添加上,速度会很快,启动妙级的 1)在Tomcat环境中解决 可以通过配置JRE使用非阻塞的Entropy Source. 在catalina.sh中加入这么一行: JAVA_ ...
- RegexBuddy 4.7.0 x64 评估试用到期,无限试用的办法
http://www.cnblogs.com/inrg/p/6491043.html 最后对比发现,在注册表 HKEY_USERS 节点下存在一个用户的项,形如 "S-1-5-21-1609 ...
- html table设置成强制不换行
在html文件中添加如下代码: <style type="text/css"> table td{word-break: keep-all;white-space:no ...
- 忘记Linux的root登录密码?不用害怕,破解掉它就可以了!!!
在开启centos 7主机后会出现下面这个界面,此时要把光标放到界面内,然后按“e”进入下一个界面. 按完“e”会出现一个新的界面,然后按“↓”找到“Linux16”这行,在最后面的UTF-8后面输入 ...
- 华为Fusioncompute 6.5.1
V6.5.1VRM“gandalf”用户的默认密码为“IaaS@OS-CLOUD9!”.CNA“gandalf”用户的默认密码为“IaaS@OS-CLOUD8!”.普通模式:admin/LaaS@PO ...