转载请注明出处: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. ACM-简单的主题Ignatius and the Princess II——hdu1027

    转载请注明出处:http://blog.csdn.net/lttree Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Othe ...

  2. PV FV PMT

  3. Oracle自增列创建方法

    最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...

  4. ACdream: Sum

    Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...

  5. 【VMware混合云】掀起你的盖头来

    作者:范军 (Frank Fan) 新浪微博:@frankfan7   微信:frankfan7 VMware混合云服务(vCHS)预计在2013年8月23日正式面向用户推出.目前开放服务的四个数据中 ...

  6. 正則表達式 取出img标签 保存于指定路径

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  7. 采用大杀招QEMU调试Linux内核代码

    Linux调试内核代码是非常麻烦.它们一般加printk, 或者使用JTAG调试. 这里的方法是使用QEMU为了调试Linux核心. 由于QEMU自己实现gdb server, 它可以容易地使用gdb ...

  8. nyoj 228 士兵杀死(五岁以下儿童)【树状数组】

    分析:这个问题问的是,因为它是一个单独的更新.因此,让我们更新,然后在c[i]表现为1~i之间,还原之后看起来像一个. #include <cstdio> #include <cst ...

  9. Trie图

    AC自动机是KMP的多串形式,当文本串失配时,AC自动机的fail指针告诉我们应该跳到哪里去继续匹配(跳到当前匹配串的最长后缀去),所以AC自动机的状态是有限的 但是AC自动机具有不确定性, 比如要求 ...

  10. Android他们控制的定义(一)

    培养自己的控制步骤定义: 1.要理解View作品  2. 分享到继承View子类 3. 要定义自己的View类添加属性  4. 绘制控件  5. 响应用户消息  6 .自己定义回调函数  一.View ...