说明:本文仅供学习交流,转载请标明出处,欢迎转载!
       今天看到剑指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. 已集成 VirtIO驱动windows server 2012, 2008, 2003的ISO镜像下载

    已集成 VirtIO驱动简体中文windows server 2012, 2008, 2003系统ISO镜像下载地址. 适用于上传自定义ISO并且使用 VirtIO驱动的kvm架构vps,vultr家 ...

  2. 梦想CAD控件安卓文字样式

    增加文字样式 用户可以增加文字样式到数据库,并设置其字体等属性,具体实现代码如下: // 增加文字样式 //getCurrentDatabase()返回当前数据库对象 //getTextstyle() ...

  3. Java集合(一)--Comparable和Comparator

    Comparable: 是集合内部的方法实现的排序,只有一个方法 public interface Comparable<T> { public int compareTo(T o); } ...

  4. 05Servlet example

    dgdfgdfggggggg Servlet 表单数据 在客户端,GET通过URL提交数据,数据在URL中可见:POST把数据放在form的数据体内提交.GET提交的数据最多只有1024字节:POST ...

  5. 经典书籍---MySQL经典书籍下载

    以下是一些经典的MySQL书籍电子版,括号内为提取码,若需自取. 欢迎阅读纸质版,尊重作者版权 高性能MySQL_中文版 [ hre3 ] 高性能MySQL_英文版[ m2xj ] MySQL技术内幕 ...

  6. linux tload-显示系统负载状况

    推荐:更多linux 性能监测与优化 关注:linux命令大全 tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语 ...

  7. 如何用纯 CSS 创作一个按钮文字滑动特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. 在线预览 https://codepen.io/zhang-ou/pen/GdpPLE 可交互视频教 ...

  8. git帮助网址

    http://rogerdudler.github.io/git-guide/index.zh.html https://help.github.com/

  9. php正则表达式匹配html标签

    用php正则表达式找出div标签,div允许多层嵌套,比如在以下文本中找出class为quizPutTag的div? <html> <head></head> &l ...

  10. 哈希表模板(Hash set)

    省选前最后的复(chui si)习(zheng zha). 上模板吧 namespace Hash_Table{ #define inf ~0U>>1 #define MaxN 10010 ...