剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述:




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


输入:



每个输入文件仅包含一组测试样例。
对于每个测试案例,输入一个数字N(1<=N<=5)。


输出:



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


样例输入:

1 

样例输出:


1
2
3
4
5
6
7
8
9

解题思路:


  直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000....

  输出,就行了...

代码:


#include <stdio.h>
int main(void){
int n,i;
while(scanf("%d",&n)!=EOF && n>=1 && n<=5){
i = n;
int m = 1;
while(i--){
m *= 10;
}
for(i=1;i<m;i++)
printf("%d\n",i);
}
return 0;
}
/**************************************************************
Problem: 1515
User: xhalo
Language: C
Result: Accepted
Time:40 ms
Memory:912 kb
****************************************************************/

  写出上面的代码,那么你就正式的掉入面试官的坑了。如果这道题的位数不是5,而是10,或者100呢。正常的int显然是无法满足的。

  因此可以考虑使用字符串或者数组表示大数据。

  下面给出了使用数组的表示方法:


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int num[10];
int add(int n);
int main(void){
int n,i;
while(scanf("%d",&n)!=EOF && n>=1 && n<=5){
memset(&num,0,sizeof(int)*10);
while(!add(n)){
int flag = 0;
for(i=10-n;i<10;i++)
if(num[i] != 0 || flag){ //如果是前面的零,则不输出;如果是后面的零,则输出
flag = 1;
printf("%d",num[i]);
}
printf("\n");
}
}
return 0;
}
int add(int n){
int isoverflow = 0;
int carry = 0;
int i;
for(i=9;i>=10-n;i--){
num[i] += carry;
if(i == 9)
num[i]++;

if(num[i] >= 10){
if(i == 10-n){
isoverflow = 1;
}else{
num[i] -= 10;
carry = 1;
}
}else{
break;
}
}
return isoverflow;
}
/**************************************************************
Problem: 1515
User: xhalo
Language: C
Result: Accepted
Time:110 ms
Memory:912 kb
****************************************************************/

剑指OFFER之打印1到最大的N位数(九度OJ1515),布布扣,bubuko.com

时间: 2024-10-11 18:21:23

剑指OFFER之打印1到最大的N位数(九度OJ1515)的相关文章

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数.输入的第二行包括m个正整数,其中每个正整数不超过10000000. 输出: 对应每个测试案例,输出m个数字能排成的最小数字. 样例输入: 3 23 13 6 2 23456 56 样

剑指OFFER之用两个栈实现队列(九度OJ1512)

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例.对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数.接下来的n行,每行输入一个队列操作:1. PUSH X 向队列中push一个整数x(x>=0)2. POP 从队列中pop一个数. 输出: 对应每个测试案例,打印所有pop操作中从队列pop中的数字.如果执行pop操作时,队列为空,则打印-1 样例输入: 3 PUSH 10

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

【剑指offer】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri

剑指OFFER之二进制中1的个数(九度OJ1513)

题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例.对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个整数..n保证是int范围内的一个整数. 输出: 对应每个测试案例,输出一个整数,代表输入的那个数中1的个数. 样例输入: 3 4 5 -1 样例输出: 1 2 32 解题思路: 首先对一个数判断1的个数,可以考虑直接遍历每一位就行了,那么实现起来,可以只看最后一位(与1进行与操作),再进行右移1位.

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

剑指offer 顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:一定要记住循环继续的条件是columns > start * 2,rows > start * 2; 一圈的打印分为四步: 第一步:无条件打印第一行,从左往右: 第二步:终止行号大于起始行号,打印最后一列,从上往下: 第

剑指Offer之打印从1到最大的n位数

基本思路 第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位.因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止.代码如下: public class Print1ToMaxOfDigits { public static void main(String[] args) { Scanner sc = new Scanner(System.i