38.输出1到最大的N位数

http://zhedahht.blog.163.com/blog/static/2541117420094279426862/

题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。

分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。

应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:


// Print numbers from 1 to the maximum number with n digits, in order
void Print1ToMaxOfNDigits_1(int n)
{
// calculate 10^n
int number = 1;
int i = 0;
while(i++ < n)
number *= 10;

// print from 1 to (10^n - 1)
for(i = 1; i < number; ++i)
printf("%d\t", i);
}

初看之下,好像没有问题。但如果我们仔细分析这个问题,就能注意到这里没有规定n的范围,当我们求最大的n位数的时候,是不是有可能用整型甚至长整型都会溢出?

分析到这里,我们很自然的就想到我们需要表达一个大数。最常用的也是最容易实现的表达大数的方法是用字符串或者整型数组(当然不一定是最有效的)。

用字符串表达数字的时候,最直观的方法就是字符串里每个字符都是’0’到’9’之间的某一个字符,表示数字中的某一位。因为数字最大是n位的,因此我们需要一个n+1位字符串(最后一位为结束符号’\0’)。当实际数字不够n位的时候,在字符串的前半部分补零。这样,数字的个位永远都在字符串的末尾(除去结尾符号)。

首先我们把字符串中每一位数字都初始化为’0’。然后每一次对字符串表达的数字加1,再输出。因此我们只需要做两件事:一是在字符串表达的数字上模拟加法。另外我们要把字符串表达的数字输出。值得注意的是,当数字不够n位的时候,我们在数字的前面补零。输出的时候这些补位的0不应该输出。比如输入3的时候,那么数字98以098的形式输出,就不符合我们的习惯了。

递归实现全排列

接下来我们换一种思路来考虑这个问题。如果我们在数字前面补0的话,就会发现n位所有10进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的10进制数。只是我们在输出的时候,数字排在前面的0我们不输出罢了。

全排列用递归很容易表达,数字的每一位都可能是0到9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。


void Print1ToMaxNDigits_Recursively(char *number, int n, int index)
{
if (index==n)
{
PrintNumber2(number);
return;
}

for (int i=0;i<10;i++)
{
number[index]=i+‘0‘;
Print1ToMaxNDigits_Recursively(number,n,index+1);
}
}

void Print1ToMaxNDigits(int n)
{
if (n<=0)
return;

char *number = new char[n+1];
memset(number,‘0‘,n);
number[n]=‘\0‘;

Print1ToMaxNDigits_Recursively(number,n,0);
delete []number;
}

38.输出1到最大的N位数

时间: 2024-10-30 05:13:56

38.输出1到最大的N位数的相关文章

按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”

1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class Text { 5 6 @SuppressWarnings("resource") 7 public static void main(String[] args) { 8 Scanner scanner = new Scanner(System.in); 9 int M = scanner.nextInt();//M代表输入的M串字符串

谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串&quot;486&quot;。n的位数不确定,可以是任意位数的整数。

8.17用递归法将一个整数n转换成字符串.例如,输入486,应输出字符串"486".n的位数不确定,可以是任意位数的整数. #include <stdio.h> char str1[20];int i=0;long n;int main(){        int longToStr(long n);    char *revstr(char *str, int len);    printf("请输入一个整数n:\n");    scanf("

任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数 字组成的最大数。

/*任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数字组成的最大数.*/#include <stdio.h>int numb(int a){ int i = 0, j = 0,sum = 0, b[4]; b[0] = a%10; b[1] = a/10%10; b[2] = a/100%10; b[3] = a/1000; for (i = 0 ;i < 4; i++) { for(j = 0;j < 3 - i; j++) { if(b[j] > b[

【编程题目】输出 1 到最大的 N 位数

65.输出 1 到最大的 N 位数(运算)题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数.比如输入 3,则输出 1.2.3 一直到最大的 3 位数即 999. 思路:肯定要考虑数字溢出的情况,用字符串表示数字,模拟加法. /* 65.输出 1 到最大的 N 位数(运算) 题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数.比如输入 3, 则输出 1.2.3 一直到最大的 3 位数即 999. */ #include <iostream> using name

输出 1 到最大的 N 位数

题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数.比如输入 3,则输出 1.2.3 一直到最大的 3 位数即 999. 思路:这是一个大数问题,必须使用一个字符串来表示数字,因为担心数字太大 void Add(string& cur) { int carry =1; int temp; int i; for(i=0;i<cur.length();i++) { temp = cur[i]-'0'+carry; carry = temp/10; temp = temp%10;

C语言输出规定长度的整数,不够位数前面补零

今天在做ACM题目的时候,遇到了这么一个问题,还真别说,这个以前真的没用过,当时就傻掉了,还好这个世界有Google,通过搜索了解了输出这种格式的C语言实现方法.但是没有找到C++的实现方法,希望知道的人留个言告诉下撒! [cpp] view plaincopy #include<stdio.h> void main() { int num; printf("Please input a number: "); scanf("%d",&num);

[转]as3 算法实例【输出1 到最大的N 位数 题目:输入数字n,按顺序输出从1 最大的n 位10 进制数。比如输入3,则输出1、2、3 一直到最大的3 位数即999。】

思路:如果我们在数字前面补0的话,就会发现n位所有10进制数其实就是n个从0到9的全排列.也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的10进制数. 1 /** 2 *ch 存放数字 3 *n n位数 4 *index 计数值 5 **/ 6 private function num(ch:Array,n:int,index:int):void 7 { 8 if(index==n) 9 { 10 trace(ch); 11 return; 12 } 13 for(var i:in

C++中输出 位宽和小数点后位数 的控制

要用到这个头文件: <iomanip> setw(x) : 表示控制输出x的位宽 setprecision(x) :表示 控制输出小数点后 x 位 cout.precision(x): 表示控制输出的 该数值的5个数字 例如:y=1.0456789 cout.precision(3); cout<<y<<endl; 输出为:1.04 (包含3个数字) #include <iostream> #include <iomanip> using nam

实验3-8 输出三角形面积和周长 (15分)

本题要求编写程序,根据输入的三角形的三条边a.b.c,计算并输出面积和周长.注意:在一个三角形中, 任意两边之和大于第三边.三角形面积计算公式:?,其中). 输入格式: 输入为3个正整数,分别代表三角形的3条边a.b.c. 输出格式: 如果输入的边能构成一个三角形,则在一行内,按照 area = 面积; perimeter = 周长 的格式输出,保留两位小数.否则,输出 These sides do not correspond to a valid triangle 输入样例1: 5 5 3