【剑指offer】打印1到最大的n数字
转载请注明出处: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数字的更多相关文章
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题
剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 【Java】 剑指offer(62) 圆圈中最后剩下的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每 ...
- 【剑指offer】11--旋转数组的最小数字(二分查找)
原创博文,转载请注明出处! # 本文是牛客网<剑指offer>刷题笔记 1.题目 旋转数组的最小数字:输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1 ...
- 剑指offer 打印从1到最大的n位数
题目描述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999. 分析:注意不能直接输入最大的n位十进制数,因为可能属于大数,这个数无法用int或 ...
- 剑指offer系列44---只出现一次 的数字
[题目]一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * [思路]异或性质:数异或自己即为0: * 一个数组中,从头到尾异或的结果为不重复数字异或结果. ...
- 剑指offer系列24---数组中重复的数字
* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重 ...
- 剑指Offer 和为S的两个数字
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...
- 剑指 offer set 3 旋转数组的最小数字
总结 1. 没有重复元素的旋转数组可用 logn 时间内求出结果. 解法有两个步骤, 先是求出发生旋转的点(以 array[0] 为支点求得), 然后用正常的二分查找给出结果 2. 有重复元素元素的旋 ...
随机推荐
- ACM-简单的主题Ignatius and the Princess II——hdu1027
转载请注明出处:http://blog.csdn.net/lttree Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Othe ...
- PV FV PMT
- Oracle自增列创建方法
最近在做Oracle的项目,由于以前没有接触过Oracle的开发,遇到了不少的问题,比如给Oracle表添加自增列,与SQL Server就不同. Oracle没有自增字段这样的功能,但是通过触发器( ...
- ACdream: Sum
Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...
- 【VMware混合云】掀起你的盖头来
作者:范军 (Frank Fan) 新浪微博:@frankfan7 微信:frankfan7 VMware混合云服务(vCHS)预计在2013年8月23日正式面向用户推出.目前开放服务的四个数据中 ...
- 正則表達式 取出img标签 保存于指定路径
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 采用大杀招QEMU调试Linux内核代码
Linux调试内核代码是非常麻烦.它们一般加printk, 或者使用JTAG调试. 这里的方法是使用QEMU为了调试Linux核心. 由于QEMU自己实现gdb server, 它可以容易地使用gdb ...
- nyoj 228 士兵杀死(五岁以下儿童)【树状数组】
分析:这个问题问的是,因为它是一个单独的更新.因此,让我们更新,然后在c[i]表现为1~i之间,还原之后看起来像一个. #include <cstdio> #include <cst ...
- Trie图
AC自动机是KMP的多串形式,当文本串失配时,AC自动机的fail指针告诉我们应该跳到哪里去继续匹配(跳到当前匹配串的最长后缀去),所以AC自动机的状态是有限的 但是AC自动机具有不确定性, 比如要求 ...
- Android他们控制的定义(一)
培养自己的控制步骤定义: 1.要理解View作品 2. 分享到继承View子类 3. 要定义自己的View类添加属性 4. 绘制控件 5. 响应用户消息 6 .自己定义回调函数 一.View ...