转载请注明出处: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. 外网SSH访问内网LINUX的N种方法

    外网SSH访问内网LINUX的N种方法 http://www.nat123.com/Pages_8_260.jsp 一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限, ...

  2. 使用CSS3制图

    参考资料:http://blog.csdn.net/fense_520/article/details/37892507 本文非转载.为个人原创,转载请先联系博主,谢谢~ 准备: <!DOCTY ...

  3. Android-它们的定义Notification

    Android-它们的定义Notification 2014年4月26日  消息栏的消息,想必各位Android发烧友非常清楚知道是什么,比方我们下载了一个应用,它可能会定时推送些消息到我们的手机中. ...

  4. HibernateReview Day1 - Introduction

    Hibernate已经学过去大概有半个月了,然后默默的忘掉了……所谓Practice makes perfect. 我尽力重新拾起来. 1.什么是ORM 在介绍Hibernate之前,我们先学习下OR ...

  5. 九度 题目1044:Pre-Post

    转载请注明本文链接http://blog.csdn.net/yangnanhai93/article/details/40658571 题目链接:pid=1044">http://ac ...

  6. C++出现计算机术语5

    class template(类模板) 可以用来定义一个类定义了一组特定类型的类的.类模板template keyword其次是尖括号(<>)附上.的列表来定义. export keywo ...

  7. 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?

    如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...

  8. 变化App.config其中值,并保存

    using System; using System.Collections.Generic; using System.Configuration; using System.IO; using S ...

  9. 白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》串行4(场景变化)

    作为一个真正的利用价格值应用,首先,你应该至少有两页,通过切换页面来实现很多其他互动.比如手机人人网,首先,打开后进入登录页面,将有登录后,新的东西.然后拉左侧面板.你可以看到相册.私人信息.像其他应 ...

  10. 【iOS开发-60】案例学习:多组数据的tableView设置、添加右側组索引、多层数据模型设置以及valueForKeyPath

    效果: 这里的数据模型有两层:每一组汽车是一层模型,每一组里面的每一行汽车品牌也是一层模型. (1)我们先创建一个WSCars模型. 在WSCars.h中: #import <Foundatio ...