说明:本文仅供学习交流,转载请标明出处,欢迎转载!
       今天看到剑指offer上的第12题,题目例如以下:
       输入数字n。按顺序打印出从1到最大的n位十位数。

比方输入3,则打印出1,2,3,...,999。

       当我看到这个题目的时候。第一感觉就是用递归,为什么呢?首先得从我们的一个实际数字出发,比方123。我们对数字加1,实际上分为例如以下两个步骤:
       步骤1:最低位加1;
       步骤2:若发生进位,则向更高位传播该进位的影响(这也是递归的所在)。
       在完毕这个算法题之前。我想插一句“细节决定成败!”,我们写一个程序,事实上大体的思路都能想到。而往往忽略对细节的考虑,如本题须要考虑的问题例如以下:
        1.怎样表示一个n位数?(用字符数组)
        2.每次加1都在最低位进行;
        3.加1后若发生进位。则将该进位传播给高位数字(这里既可用循环,也可用递归);
        4.若最高位发生进位,则溢出,该溢出可作为打印最后一个数的标志;
        5.打印数字时,仅仅能从最高位不为0的数字起開始打印。(这符合数字的正常表示)
       递归实现例如以下:
#include<iostream>
#include<cstring>
using namespace std;
bool Increment(char *str,int length)//字符串加1,假设为发生溢出,则返回true,否则返回返回false
{
if(str==NULL && length<1)//假设发生溢出。则返回false
{
return false;
}
int sum=str[length-1]-'0'+1;
if(sum<10)//假设不发生进位
{
str[length-1]+=1;
return true;
}
else
{
if(length-1==0)//假设溢出,则返回false
{
return false;
}
str[length-1]='0';//发生进位,把剩下的任务交给前length-1个字符
return Increment(str,length-1);//递归表达式
}
}
void print(char *str)//打印字符,打印时去掉前面的几个0
{
bool isBegin=false;//标识能否够開始输出
int i;
for(i=0;i<strlen(str);i++)
{
if(!isBegin && str[i]!='0')//假设找到第一个非0字符,则标识能够開始输出了
{
isBegin=true;
}
if(isBegin)
{
cout<<str[i];
}
}
cout<<endl;
} void ToMaxN(int n)//打印从1到最大的N位数
{
if(n>=1)
{
char *str=new char[n+1];
memset(str,'0',n);
str[n]='\0';
while(Increment(str,n))//假设能顺利增长
{
print(str);
}
delete []str;
}
}
int main()
{
int n;
while(cin>>n)
{
if(n>=1 && n<=5)
{
ToMaxN(n);
}
}
return 0;
}
        非递归实现例如以下:
#include<iostream>
#include<cstring>
using namespace std;
bool Increment(char * str)//用于将当前字符串相应的数字加1,返回true表示添加成功
{
int len=strlen(str);
int current=str[len-1]-'0'+1;//将个位数字加1,current表示加1后的值
int i=len-1;//以下開始传播个位加1后的连锁进位反应
while(i>=0)//用i表示当前位
{
if(current<10)//若加1后不进位
{
str[i]=str[i]+1;
break;
}
else//假设当前位发生进位
{
if(i==0)//假设进位的是最高位。则直接发生溢出
{
return false;
}
else//假设进位的不是最高位,这里能保证i!=0,由于上面有个为0的分支处理
{
str[i]='0';//先将本位归零
i=i-1;//開始处理本位的上一位
current=str[i]-'0'+1;
}
}
}
return true;
}
void print(char *str)//显示该数字
{
bool begin=false;
int i;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(!begin && str[i]!='0')
{
begin=true;
}
if(begin)//假设已经找到第一个非0的高位数字
{
cout<<str[i];
}
}
cout<<endl;
} void ToMaxN(int n)//client调用的函数
{
char *str=new char[n+1];
memset(str,'0',n);//注意初值在中间,不是第三个參数
str[n]='\0';
while(Increment(str))
{
print(str);
}
delete []str;
}
int main()
{
int n;
while(cin>>n)
{
if(n>=1 && n<=5)
{
ToMaxN(n);
}
}
return 0;
}
        測试结果例如以下:
       
參考资料:
   《剑指offer》

算法题:打印1到最大的n位数的更多相关文章

  1. 打印1到最大的n位数-Java

    在练习剑指offer的时候,第12题打印1到最大的n位数的时候,想找个java版的,但大家要么用BigInteger做,要么给出其他的方法.我觉得要给就给最好的方法,下面是我自己参考C++代码写的ja ...

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

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

  3. python算法题

    python几道简单的算法题   最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都 ...

  4. java基础算法题

    为了提高自己的代码能力和算法能力,我决定每天学习一道算法题,吸收前辈思想. [程序1] TestRabbit.java 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三 ...

  5. 面试经典算法题集锦——《剑指 offer》小结

    从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...

  6. LeetCode算法题-Array Partition I(Java实现)

    这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...

  7. LeetCode算法题-Number of Segments in a String(Java实现)

    这是悦乐书的第226次更新,第239篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第93题(顺位题号是434).计算字符串中的段数,其中段定义为非空格字符的连续序列.请注 ...

  8. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  9. 简单的PHP算法题

    简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...

随机推荐

  1. Android(java)学习笔记206:JNI之工具快速开发步骤

    下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...

  2. Windows提高_1.2遍历进程、遍历模块

    进程 什么是进程? 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程. 进程 ...

  3. 设置vscode为中文

    设置vscode为中文 ctr+shift+p 输入 configure language 进 en更改为zh-cn , 重启vscode即可 , 如果还不行,就安装插件

  4. R语言学习 - 箱线图(小提琴图、抖动图、区域散点图)

    箱线图 箱线图是能同时反映数据统计量和整体分布,又很漂亮的展示图.在2014年的Nature Method上有2篇Correspondence论述了使用箱线图的好处和一个在线绘制箱线图的工具.就这样都 ...

  5. UVA - 1620 Lazy Susan(逆序数)

    题目: 把1~n(n≤500)放到一个圆盘里,每个数恰好出现一次.每次可以选4个连续的数字翻转顺序.问能不能变成1.2.3....n的顺序. 思路: 这样的题的规律真的是一点都不好推,看了网上的博客知 ...

  6. laravel 开发辅助工具

    laravel 开发辅助工具 配置 添加服务提供商 将下面这行添加至 config/app.php 文件 providers 数组中: 'providers' => [ ... App\Plug ...

  7. 省市区json结构

    [ { "label": "北京市", "value": "北京市", "children": [ ...

  8. Mac安装virtualwrapper时报错No module named virtualenvwrapper

    1. 前言 我在使用mac安装virtualwrapper的时候遇到了问题,搞了好长时间,才弄好,在这里总结一下分享出来,供遇到相同的问题的朋友使用,少走些弯路. 2. 问题说明 Mac默认系统的py ...

  9. BC in fluent

    Boundary conditions in Fluent Table of Contents 1. Boundary Conditions (BC) 1.1. Turbulence Paramete ...

  10. CodeForcesGym 100753F Divisions

    Divisions Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Or ...