/////////////////////////////////////////////////////////////////////////////////////

// 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位数的更多相关文章

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

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

  2. 面试题12:打印1到最大的n位数

    // 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

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

    书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...

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

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

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

    题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...

  6. 12 打印1到最大的n位数

    输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...

  7. 剑指Offer面试题:11.打印1到最大的n位数

    一.题目:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二.不同的解法 2.1 不假思索的解法 最容易想到的办 ...

  8. 剑指Offer面试题:9.打印1到最大的n位数

    一 题目:打印1到最大的n位数 题目:输入数字n,按顺序打印从1到最大的n位十进制.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二 不考虑大数解法 // 打印从1到最大的n位数 voi ...

  9. 每天一道算法题(15)——打印1到最大的n位数

    题目: 打印1到最大的n位数.如n=4,打印1-9999. 思路: 由于直接使用循环会导致int或者long long都不够存储.因此使用字符串来存储数据,这里涉及到数字转换成字符串以及字符串的加法. ...

随机推荐

  1. linux中 systemd相关配置

    systemd相关配置 推荐使用systemd管理进程,相比使用supervisord systemd提供系统级别的支援. 一.系统管理 Systemd 并不是一个命令,而是一组命令,涉及到系统管理的 ...

  2. 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链

    区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...

  3. 下载安装Xocde并创建一个C语言的项目工程

    安装好Xcode后,新建工程 选择command line tool 选择c语言 点击创建 可以设置运行平台版本 设置 设置c标准 去掉c++ 支持 打开编辑页面 运行 参考: https://www ...

  4. python中的匿名函数

    python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda的主体是一 ...

  5. WINRAR弹窗堆栈

    0:000> db 004ddfa8004ddfa8 6f 00 70 00 65 00 6e 00-00 00 00 00 2d 00 6e 00 o.p.e.n.....-.n. 03063 ...

  6. centos7 设置 tomcat 开机自启

    1.创建文件 # vi /etc/systemd/system/tomcat.service [Unit] Description=Tomcat8540 After=syslog.target net ...

  7. Wamp win10 1077error

    检查日志发现了1077错误 State of services:   The service 'wampapache64' is NOT started EXIT error code:1077 He ...

  8. pip 安装报错

    pip3 install uwsgi 报错 Command in /tmp/pip-build-5m77h_mm/uwsgi/ yum -y install python36-devel 解决

  9. shell中的for循环用法详解

    for i in “file1” “file2” “file3”for i in /boot/*for i in /etc/*.conffor i in $(seq -w 10) –>等宽的01 ...

  10. spring 使用@Valid校验数据出错DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Failed to resolve argument 0 of type

    问题原因:在 @Valid 的那个参数后面紧跟着一个 BindingResult 的参数(一定要紧跟着) 参考来源:https://segmentfault.com/q/101000000838468 ...