打印出从1到最大的n位十进制数
首先这一题会溢出,要考虑的大数问题。所以不能用简单的是int类型数来表示(32位无符号int 范围是0x00000000···0xFFFFFFFF),下面主要是非递归的实现代码,自己做了注释方便以后回顾。
#include "stdafx.h"
#include <iostream>
using namespace std;
//输入数字n,按照顺序打印出从1到最大的n位十进制数。
bool Increament(char *number);
void printNumber(char *number);
void prin1ToMaxOfDIgits(int n)
{
if(n<=)
return ;
char *number=new char[n+];//还包括'\0'
memset(number,'',n);
number[n]='\0'; while(!Increament(number)) //每次while一次就打印一个数,如果不溢出就打印
{
printNumber(number);
}
delete []number;
} bool Increament(char *number)
{
bool isOverflow = false;
int nTakeOver = ;
int nLength = strlen(number); for(int i = nLength - ; i >= ; i --)
{
int nSum = number[i]-''+ nTakeOver; //ntakeOver相当于进1位(这是其他位加1的核心之所在),注意这里减了'0',取其增加量,如nsum=0,1,2,3...,不减'0'(48),
//下面无法判断
if(i == nLength - )
nSum ++; //除了最低位是这样++,其他位都是按照进位的方式改变的,因为每次for循环会遍历
if(nSum >= ) //只是发生在进位的时候,当发生进位,当前位前一位就增加一个nTakeOver=1
{
if(i==) //如果是最左边的位,溢出(isOverflow= true)此时不能进位了
isOverflow= true;
else
{
nTakeOver=; //要进一位,也就是当前位的高一位会自动增加了一个1. 呼应nSum = number[i]-'0'+ nTakeOver,下次for循环i会-1,是当前位的高一位
nSum=nSum-; //当前位增量恢复到0
number[i] = nSum+''; //同时再转换到+'0'位置
}
}
else
{
number[i] = nSum+''; //增量+'0'的位置
break;
}
}
return isOverflow; //返回溢出判断
} void printNumber(char *number)
{
bool isBeginning0=true;
int nlength=strlen(number); for (int i=;i<nlength;i++)
{
if(isBeginning0 && number[i]!='') //从左往右,当碰到第一个非0字符的时候就从这里开始打印
isBeginning0=false;
if(!isBeginning0)
cout<<number[i]<<" ";
}
cout<<endl;
} void main()
{
prin1ToMaxOfDIgits();
}

打印出从1到最大的n位十进制数的更多相关文章
- 输入数字n,按顺序打印出从1到最大的n位十进制数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的999. 跳进面试官的陷阱 void PrintfToMaxNDigits(int n) { ; ; ...
- 打印1到最大的n位数
打印1到最大的n位数----java实现 题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 分析: 1.这是一个典型的 ...
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
问题描述: 输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999. 思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可. public ...
- C++面试题一大波
//打印1到最大的n位数. //题目:输入数字n.按顺序打印出从1到最大的n位十进制数.比方: //输入3.则打印出1.2.3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就 ...
- 代码的完整性:打印1到最大的n位数
输入数字n,按顺序打印出从1到最大的n位十进制数. 比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999. 全排列打印 public class Main { public sta ...
- (剑指Offer)面试题12:打印1到最大的n位数
题目: 输入数字n,按顺序打印出从1到最大的n位十进制数. 比如输入3,打印1,2,3一直到最大的3位数即999. 思路: 1.不考虑n的范围,直接打印. void Print1ToMaxOfNDig ...
- 《剑指Offer》题十一~题二十
十一.旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组{3, 4, 5, 1, 2}为{ ...
- 剑指offer 面试17题
面试17题: 题目:打印从1到最大的n位数 题:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1.2.3一直到最大的3位数999. 解题思路:需要考虑大数问题,这是题目设置的陷 ...
- 【剑指offer】打印1到最大的n位数
题目描写叙述: 输入数字n,按顺序打印出从1到最大的n位十进制数.比方输入3,则打印出1.2.3一直到最大的3位数即999. 分析描写叙述: 首先想到的是先计算出最大的n位数是多少,然后用一个循环从1 ...
随机推荐
- bzoj 1318: [Spoj744] Longest Permutation 智商题
1318: [Spoj744] Longest Permutation Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 361 Solved: 215 ...
- hdu 4665
转载一下 用的搜索 竟然过了 ............代码 ....... #include<stdio.h> #include<string.h> #include&l ...
- 程序自动生成Dump文件
前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...
- SetTimer在无窗口和有窗口线程的使用 . .
今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID. 对应计时器ID的输出的是一个随机数字. 原来在m ...
- [扫描线]POJ2932 Coneology
题意:有n个圆 依次给了半径和圆心坐标 保证输入的圆不相交(只有 相离 和 内含/外含 的情况) 问 有几个圆 不内含在其他圆中,并分别列出这几个圆的编号(1~n) (n的范围是[1, 4000 ...
- Armitage初始化
Kali2.0 Armitage初始化步骤如下 (1)点击页面的Armitage按钮 (2)提示Metasploit RPC server is not running,是否启动该服务,选择是 (3) ...
- 【HDOJ】4601 Letter Tree
挺有意思的一道题,思路肯定是将图转化为Trie树,这样可以求得字典序.然后,按照trie的层次求解.一直wa的原因在于将树转化为线性数据结构时要从原树遍历,从trie遍历就会wa.不同结点可能映射为t ...
- Playing with cubes II
Description: Hey Codewarrior! You already implemented a Cube class, but now we need your help again! ...
- [转] android自动化测试之MonkeyRunner使用实例(三)
一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1 用Elipse打开Android模拟器或在CMD中 ...
- html5自带表单验证-美化改造
神奇的代码 暂且叫做html5.css /* === HTML5 validation styles === */ .myform select:required, .myform input:req ...