转载请注明出处:http://blog.csdn.net/ns_code/article/details/25562105


剑指offer第12题。九度OJ測试通过。

题目描写叙述:

给定一个数字N,打印从1到最大的N位数。

输入:

每一个输入文件仅包括一组測试例子。
对于每一个測试案例。输入一个数字N(1<=N<=5)。

输出:

相应每一个測试案例,依次打印从1到最大的N位数。

例子输入:
1
例子输出:
1
2
3
4
5
6
7
8
9

题目要求N<=5,因此不会出现大数问题。我们这里考虑大数问题。相同用字符串来处理大数问题,用字符串模拟实现大数自加1。

AC代码例如以下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h> /*
打印字符数表示的数字。要跳过前面的'0'
*/
void PrintNum(char *num)
{
int i = 0;
while(num[i] == '0')
i++;
puts(num+i);
} /*
字符串表示的数字模拟自加1
*/
bool Increment(char *num)
{
bool isOverflow = false;
int len = strlen(num);
int i; //字符转化为整数
for(i=0;i<len;i++)
num[i] = num[i] - '0'; //计算加1的结果
num[len-1]++;
for(i=len-1;i>=0;i--)
{
if(num[i]>=10)
{
if(i == 0)
{ //假设在最高位进位,则说明打印完了
isOverflow = true;
num[i]--;
}
else
{
num[i] -= 10;
num[i-1] += 1;
}
}
else
break;
} //整数转化为字符
for(i=0;i<len;i++)
num[i] = num[i] + '0'; return isOverflow; } /*
打印从1到最大的n位数
*/
void PrintToMaxN(int n)
{
if(n<=0)
return; char *num = (char *)malloc((n+1)*sizeof(char));
if(num == NULL)
exit(EXIT_FAILURE);
//每一个字节都初始化为'0'字符
memset(num,'0',n*sizeof(char));
num[n] = '\0';
while(!Increment(num))
PrintNum(num); free(num);
num = NULL;
} int main()
{
int n;
scanf("%d",&n);
PrintToMaxN(n);
return 0;
}
/**************************************************************
    Problem: 1515
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:20 ms
    Memory:912 kb
****************************************************************/

全排列递归实现方法:

数字的每一位都可能是0-9中的一个位数,我们把数字的每一位都从0到9排列一边,就得到了所有的十进制数,全排列用递归非常easy表达,数字的每一位都可能是一个数,然后设置下一位。这里递归结束的条件是我们已经设置了数字的最后一位。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
/*
打印字符数表示的数字。要跳过前面的'0'
*/
void PrintNum(char *num)
{
int i = 0;
while(num[i] == '0')
i++;
puts(num+i);
} /*
递归设置从index位往右的各位数字。并打印出来
*/
void RecursionPrint1ToN(char *num,int len,int index)
{
if(index == len)
{
PrintNum(num);
return;
}
int i;
for(i=0;i<10;i++)
{
num[index] = i + '0';
RecursionPrint1ToN(num,len,index+1);
}
} /*
打印从1到最大的n位数
*/
void Print1ToMaxN(int n)
{
if(n<=0)
return; char *num = (char *)malloc((n+1)*sizeof(char));
if(num == NULL)
exit(EXIT_FAILURE);
//每一个字节都初始化为'0'字符
memset(num,'0',n*sizeof(char));
num[n] = '\0'; //所有打印出来
RecursionPrint1ToN(num,n,0); free(num);
num = NULL;
} int main()
{
int n;
scanf("%d",&n);
Print1ToMaxN(n);
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【剑指offer】打印1到最大的n数字的更多相关文章

  1. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  2. 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题

    剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...

  3. 【剑指Offer】旋转数组中的最小数字 解题报告(Python)

    [剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  4. 【Java】 剑指offer(62) 圆圈中最后剩下的数字

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每 ...

  5. 【剑指offer】11--旋转数组的最小数字(二分查找)

    原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记 1.题目 旋转数组的最小数字:输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1 ...

  6. 剑指offer 打印从1到最大的n位数

    题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或 ...

  7. 剑指offer系列44---只出现一次 的数字

    [题目]一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * [思路]异或性质:数异或自己即为0: * 一个数组中,从头到尾异或的结果为不重复数字异或结果. ...

  8. 剑指offer系列24---数组中重复的数字

    * [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重 ...

  9. 剑指Offer 和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...

  10. 剑指 offer set 3 旋转数组的最小数字

    总结 1. 没有重复元素的旋转数组可用 logn 时间内求出结果. 解法有两个步骤, 先是求出发生旋转的点(以 array[0] 为支点求得), 然后用正常的二分查找给出结果 2. 有重复元素元素的旋 ...

随机推荐

  1. java 短信验证码===随机数

    生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...

  2. uIP中国的协议文件:Ch01

    uIP0.9 参考 by Doxygen 1.3.3 Tue Oct 7 15:51:00 2003 译: fishOnFly(鱼在飞) uIP-refman中文pdf下载 第1章  uIP TCP/ ...

  3. 王立平--android发育,转让eclipse可选颜色

    android:background="@android:color/white" 版权声明:本文博主原创文章.博客,未经同意不得转载.

  4. Linux学习记录--命名管道通信

    命名管道通信 什么是命名管道 一个主要的限制是,它是匿名管道的应用还没有名字,因此,只有它可以用于进程间通信的方式与亲缘关系.在命名管道(named pipe或FIFO)提出后,该限制得到了克服.FI ...

  5. Android Studio怎样安装插件

    Android Studio安装插件的方式事实上和Eclipse大同小异.废话不多说,直接上图: 区域1:你当前已经安装了的插件 区域2:在线安装 区域3:从硬盘安装,即针对你已经下载好了的插件,可通 ...

  6. kindeditor-网页文字编辑

    实例下载地址:http://download.csdn.net/download/l294333475/7941759 <!DOCTYPE html PUBLIC "-//W3C//D ...

  7. XMPP我写底层协议(零)--废话和准备开幕前

    当我想写一个非常早期的一点总结.但总是忙没有时间停止做这样的事情. 秦与我的兄弟之前说的,这并不是说我没开灵.但是,因为很多事情还没有时间来写blog. 我没有完全理解,真到自己在这个位置上的时间,能 ...

  8. 【NO.3】 c program to caculate and display sum of two matrix

    source code: #include "stdafx.h" /* display sum of two matrix*/ int _tmain(int argc, _TCHA ...

  9. Linux 下开启ssh服务(转)

    二.SSH SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目 ...

  10. BZOJ 1150 CTSC2007 数据备份Backup 堆+馋

    标题效果:给定一个长度n−1n-1的序列,要求选出kk个不相邻的数使得和最小 费用流显然能跑.并且显然过不去- - 考虑用堆模拟费用流 一个错误的贪心是每次取最小.这样显然过不去例子 我们把[每次取最 ...