题目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都不够存储.因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法. ...
随机推荐
- 线段树QWQ
一直没碰过线段树,个人认为好长好难,不过这几天做题遇到了裸的线段树的题,TAT. 线段树我理解就是把二叉树的左右节点现在分别看成是两个区间. 那么现在这两个区间的端点怎么存放?怎么能够把这个区间里的数 ...
- 在树莓派4b上安装 ROS MELODIC 源码安装
按照以下步骤照做就可以了,很简单的,就是浪费一点点时间罢了.也可以退而求其次,买个树莓派3B+来玩,哈哈. Step 1: Install Dependecies and Download the P ...
- ORM SQLAlchemy - 对象关联
>>> from sqlalchemy import Column, Integer, String >>> class User(Base): ... __tab ...
- Jmeter Web 性能测试入门 (二):Fiddler 抓取 http/https 请求
jmeter自带了拦截request的功能,并且也有对应的tool:badboy 可以用.但由于我经常做移动端的项目,个人还是习惯用fiddler来收集request. 官网下载并安装Fiddler ...
- OpenResty之指令与常用API
1. 指令 通过 Lua 编写 Nginx 脚本的基本构建块是指令.指令常用于指定 Lua 代码是几时执行的以及如何使用运行的结果.下图展示了指令执行的顺序. lua_capture_error_lo ...
- 使用hibernate利用实体类生成表和利用表生成实体类
1,配置数据库,这里以oracle数据库为例.点击右侧Database图标:
- kafka 基本原理简介
Kafka是啥?用Kafka官方的话来说就是: Kafka is used for building real-time data pipelines and streaming apps. It i ...
- express利用nodemailer发送邮件(163邮箱)
Nodemailer 是一个简单易用的Node.js邮件发送组件 首先安装这个组件 npm install nodemailer --save 安装之后,可以在某个get请求下,发送邮件,具体路由代码 ...
- 转载: beta分布介绍
最近在看机器学习方面的资料,作为入门的李航教授所写的<统计机器学习>一书,刚看完第一章我也是基本处于懵了的状态,其中有一道题提到贝叶斯估计,看了下网上的资料都提到了一个叫做 beta分布的 ...
- Jmeter启动闪退
背景:使用Jmeter进行性能测试脚本开发,实现Jmeter接口开发Java请求 问题再现: 1.在官网上下载Jmeter3.2版本,打开jmeter.bat,启动成功 2.在IDEA中创建测试项目和 ...