说明:本文仅供学习交流,转载请标明出处,欢迎转载!
       今天看到剑指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. ArcGIS 坐标系 整理

    刚使用ArcGIS的时候,对坐标系的点一直很混乱,今天想要整理整理. 一.地理坐标系与投影坐标系的区分 首先要能区分地理坐标系(GCS)和投影坐标系(PCS). 上面的是地理坐标系的举例,简单理解为不 ...

  2. POJ_2387_最短路

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46859   Accepted ...

  3. MySQLWorkBench怎么设置主键自增长

    参考 https://blog.csdn.net/qq_40472613/article/details/87858099 勾选AI选项,相当于执行了这个语句: AUTO_INCREMENT表示自增 ...

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

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

  5. gym101343 2017 JUST Programming Contest 2.0

    A.On The Way to Lucky Plaza  (数论)题意:m个店 每个店可以买一个小球的概率为p       求恰好在第m个店买到k个小球的概率 题解:求在前m-1个店买k-1个球再*p ...

  6. Android studio 开发一个用户登录界面

    Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...

  7. boostrap标签

    字体: <lead>:加强显示 <strong><b>:字体加粗 <i><em>:斜体字 .text-muted:提示,使用浅灰色(#999 ...

  8. 判断机型是否为iphoneX

    判断机型是否为iphoneX isIPhoneX() {                 var u = navigator.userAgent;                 var isIOS ...

  9. VM 安装ubuntu16.04简易方法

    在已经安装好VM10虚拟机后 首先文件—>新建虚拟机—>典型(标准)  选择稍后安装操作系统,后续要使用的是已经下载好的ubuntu16.04镜像  选择操作系统是linux ,版本是ub ...

  10. 多校1007 Naive Operations

    >>点击进入原题测试<< 思路:好像是第一次这么印象深刻的写线段树,说实话,这个题确实很有意思,值得学习. 看了大神讲解视频,但是自己写的还是超时了. 参考来自 https:/ ...