12:打印 1 到最大的 n 位数
题目:输入数字 n。按顺序打印出从 1 到 最大的 n 位十进制数。比方输入 3 ,则打印出 1、2 、3 一直到最大的3位数即 999。
解析:
easy知道不能用 int 等数字类型表示(大数问题)
在字符串上模拟数字加法
关键点:
1. 怎样用字符串表示n位数?
2. 怎样实现字符串数的自增操作?
3. 怎样打印一个字符串数?
- 申请长度是n+1的字符数组number。 number[0] 是最高位, number[n-1]最低位, number[n] = ‘\0’
- 首先把字符串中的每个数字都初始化为’0’ (注意是字符’0’,不是0)。然后每一次为字符串表示的数字加 1.
- 自增操作时。通过最高位是否会产生进位来推断是否到达最大数。
- 打印字符串数时,应该省略掉高位的无效0
#include <iostream>
#include <stdio.h>
using namespace std;
bool Increment(char* number, int n);
void PrintNum(char* number, int n);
void Print1ToMaxOfNDigits(int n) {
if (n <= 0) // 仅仅要有输入就要考虑输入合法性问题
return;
char* number = new char[n + 1]; // 最后一位放 '\0'
memset(number, '0', n); // 注意是 '0' 不是 0
number[n] = '\0';
while (Increment(number, n) == true) {
PrintNum(number, n);
}
delete []number;
}
bool Increment(char* number, int n)
{
int sum = 0, carry = 0;
for (int i = n - 1; i >= 0; i--) {
sum = (number[i] - '0') + carry;
if (i == n - 1) // 在末位 + 1
sum++;
if (sum >= 10) {
if (i == 0) // 最高位产生进位,已到达最大数
return false;
sum -= 10;
carry = 1;
number[i] = '0' + sum;
} else {
number[i] = '0' + sum; // 已无进位,自增结束
break;
}
}
return true;
}
void PrintNum(char* number, int n)
{
int i = 0;
while (number[i] == '0') // 跳过前面 '0'
i++;
for (; i < n; i++)
printf("%c", number[i]);
cout << " ";
}
int main()
{
Print1ToMaxOfNDigits(-1);
Print1ToMaxOfNDigits(0);
Print1ToMaxOfNDigits(3);
// Print1ToMaxOfNDigits(10);
}
全排列法递归打印
我们把每位数字都从 0~9 排列一遍就能得到全部的十进制数,仅仅是打印时省略掉高位无效 0
通过递归实现。从最高位開始。每一位都可能是0~9中的一个数。针对每一种可能设置下一位。递归结束条件是当我们设置了数字的最后一位。
void Print1ToMaxOfNDigits2(int n) {
if (n <= 0)
return;
char* number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
Print1ToMaxOfNDigits2Recurisively(number, n, 0);
}
void Print1ToMaxOfNDigits2Recurisively(char* number, int len, int index) {
if (index == len) {
PrintNum(number, len); // 使用上文中的打印函数
return;
}
for (int i = 0; i < 10; i++) {
number[index] = '0' + i;
Print1ToMaxOfNDigits2Recurisively(number, len, index + 1);
}
}
12:打印 1 到最大的 n 位数的更多相关文章
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 面试题12:打印1到最大的n位数
// 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- 题目12 打印1到最大的n位数
///////////////////////////////////////////////////////////////////////////////////// // 2.打印1到最大的n位 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- 12 打印1到最大的n位数
输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999.由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 cha ...
- 《剑指offer》面试题12 打印1到最大的n位数 Java版
书中方法:这道题的一个陷阱在于不能用int或者long去存储你要打印的数,然后用打印函数打印,因为这个数可能会很大.如果加1后超出了最大的n位数,就不打印了.用最高位是否进位判断是否结束,打印的时候注 ...
- 剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 【面试题012】打印1到最大的n位数
[面试题012]打印1到最大的n位数 大数问题 字符串中的每一个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个长度为n+1的字符串,字符串的最后 ...
随机推荐
- 在magento的eav模型中如何在更新记录时只在value表的原值上更新
1,一般情况下,当我们在调用getModel在load某条实体接着更新对应实体上的值是,都不会覆盖原来的实体value表上的值,而是保留原来的,并在value表上重新创建一条值记录,比如初始表如下: ...
- 关联规则推荐及Apriori算法
参考这篇文章: http://blog.csdn.net/rongyongfeikai2/article/details/40457827 这条关联规则的支持度:support = P(A并B) 这条 ...
- C++里面mutable的作用
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...
- C++ 嵌入汇编程序提高计算效率
因为汇编语言比C++更接近硬件底层,所以在性能要求高的程序中往往能够採取在C++代码中嵌入汇编的方式来给程序提速. 在VC中能够简单的通过 __asm { //在这里加入汇编代码 } 来实现. 以下通 ...
- vijos- P1385盗窃-月之眼 (水题 + python)
P1385盗窃-月之眼 Accepted 标签:怪盗基德 VS OIBH[显示标签] 背景 怪盗基德 VS OIBH 第三话 描写叙述 怪盗基德第三次来到熟悉的OIBH总部.屡屡失败的OIBH这次看守 ...
- 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列
Problem A: Krito的讨伐 Description Krito终于干掉了99层的boss,来到了第100层.第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点 ...
- 【NOI 2015】 程序自动分析
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4195 [算法] 并查集 [代码] #include<bits/stdc++.h ...
- ROS安装教程
对于ROS的安装,在它的官方网站: http://wiki.ros.org/ROS/Installation 中也有详细说明.但是对于像博主这样先天英语发育不全的人来说,直接看官网还是有点困难的. 所 ...
- 20个非常有用的Java程序片段--转
原文地址:http://geek.csdn.net/news/detail/236591 下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = ...
- python模拟登陆知乎
---恢复内容开始--- 在完成前面的阶段的任务之后,我们现在已经能够尝试着去模拟登录一些网站了.在这里我们模拟登录一下知乎做一下实验.笔者在这里总共用了三天多的时间,下面给大家分享一下笔者是怎么一步 ...