说明:本文仅供学习交流,转载请标明出处,欢迎转载!
       今天看到剑指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. 扩增子分析解读4去嵌合体 非细菌序列 生成代表性序列和OTU表

    本节课程,需要先完成 扩增子分析解读1质控 实验设计 双端序列合并 2提取barcode 质控及样品拆分 切除扩增引物 3格式转换 去冗余 聚类   先看一下扩增子分析的整体流程,从下向上逐层分析 分 ...

  2. JSON字符串的生成

    public class Corporation { public string remark { get; set; } public string version { get; set; } pu ...

  3. vue基础---条件渲染

    (1)v-if条件渲染 v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. 可以用 v-else 添加一个“else 块”: ①表达式 <di ...

  4. 07Java Server Pages

    Java Server Pages JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分. JSP全称Java Server Pages,是一种动态网页开发技术.它 ...

  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. Java垃圾回收简介

    Java关键术语 JavaAPI:一系列帮助开发者创建Java应用程序的封装好的库. Java 开发工具包 (JDK):一系列工具帮助开发者创建Java应用程序.JDK包含工具编译.运行.打包.分发和 ...

  7. 微信小程序 导航 4种页面跳转 详解

    1.wx.navigateTo   保留当前页面,跳转到应用内的某个页面,目前页面路径最多只能十层.  参数:url(可携带参数) .success .fail .complete 可用wxml代替: ...

  8. ubuntu 常见的操作命令

    原博客地址为:https://blog.csdn.net/qq_33421080/article/details/76551554 1.cd命令: cd:切换到当前用户根目录,默认[/home/用户名 ...

  9. js之DOM直接操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. PyCharm开发GUI之PyQt安装

    开发环境 PyCharm 2018.3.3python3.7 1 安装pyqt5 pip install PyQt5-tools 2 配置PyCharm 2.1 配置设计器 其中,program为C: ...