打印1到最大的n位数
打印1到最大的n位数----java实现
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如,输入3,则打印出1,2,3,.....,一直到最大的3位数即999。
分析:
1、这是一个典型的大数加法问题,无论是int还是long long类型多无法表示。所以在解决大数问题时,通常是使用字符串或者数组实现其功能(由于个人比较钟爱数组,所以下面代码是使用数组实现的)。
2、在大数的加法中,我们需要注意的问题是进位问题。
3、在该题中还需要判断是否为最大的n位整数。这里需要一个小技巧,我们只需判断最高位(第n位)是否要进位,如果需进位,则已经为最大数。

package com.edu;
public class PrintMaxOfNDigits {
public boolean Increment(int[] number){ // 这个方法是用来实现对数加1操作
boolean isOverflow = false;
int nTakeOver=0;
for(int i=number.length-1;i>=0;i--){
int nSum = number[i]+nTakeOver;
if(i==number.length-1)
nSum++;
if(nSum>=10){
if(i==0)
isOverflow=true;
else{
nTakeOver=1;
nSum=nSum-10;
number[i]=nSum;
}
}
else{
number[i]=nSum;
break;
}
}
return isOverflow;
}
public void PrintNumber(int[] number){ //该方法是负责打印一个正类,千万不要尝试将数组变成一个整数
boolean isBeginning=true;
for(int i=0;i<number.length;i++){
if(isBeginning&&number[i]!=0)
isBeginning=false;
if(!isBeginning){
System.out.print(number[i]);
}
}
}
public void Test(int n){ //打印从1到最大的n位整数
if(n<=0)
System.out.println("输入出错,请重新输入!");
int[] number = new int[n];
while(!Increment(number)){
PrintNumber(number);
//System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new PrintMaxOfNDigits().Test(1);
}
}

第二种解法:全排列的思想

//第二中方法实现,全排序实现
public void PrintMaxOfNdigits(int[] number,int length,int index){
if(index ==length-1){
PrintNumber(number);
return;
}
for(int i=0;i<10;i++){
number[index+1]=i;
PrintMaxOfNdigits(number, length, index+1);
}
} public void Test1(int n){
if(n<=0)
return;
int[] number = new int[n];
for(int i=0;i<10;i++){
number[0]=i;
PrintMaxOfNdigits(number, n, 0);
}
}

类似的题目还有:

描述 编程精确计算2的N次方。(N是介于100和1000之间的整数)。
输入:正整数N (100≤N≤1000)
输出:2的N次方
样例输入:200
样例输出:1606938044258990275541962092341162602522202993782792835301376

下面给出c语言的代码:

#include<stdio.h>
#include<math.h> void main(){
int i,j,n,temp,k=0,sub=0;
int a[1000];
a[0]=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=0;j<=sub;j++) a[j]=a[j]*2;
if(a[sub]/10==1)
{
sub++;
a[sub]=0;
}
for(j=0;j<=sub;j++)
{
temp=(a[j]+k)%10;
k=a[j]/10;
a[j]=temp;
}
}
for(j=sub;j>=0;j--)
printf("%d",a[j]); }

描述:求两个非负整数(1000位以内)的和。
输入:两个非负整数(1000位以内),以空格分隔。
输出:两个非负整数的和。
样例
输入:111111111111 222222222222
样例输出:333333333333
下面个出的代码是用使用字符串实现的:

#include<stdio.h>
#include<string.h> char* r(char a[])
{
int i,j;
char t;
i=strlen(a)-1;
j=0;
while(j<i)
{
t=a[j];
a[j]=a[i];
a[i]=t;
--i;++j;
}
return a;
}
int main()
{
char a[1000],c[1000];
int b[1000]={0};
int i,t,m,n,mx,mi,k=0;
scanf("%s %s",a,c);
r(a);
r(c);
t=strlen(a);
m=strlen(c);
mx=t>m?t:m;
mi=t<m?t:m;
for(i=0;i<mi;i++)
{
n=a[i]+c[i]-'0'-'0';
b[i]=(n+k)%10;
k=(n+k)/10;
}
for(i=mi;i<mx;++i)
{
if(mx==t)
n=a[i]-'0';
if(mx==m)
n=c[i]-'0';
b[i]=(n+k)%10;
k=(n+k)/10;
}
if(k==1)
{
b[mx]=1;
++mx;
}
for(i=mx-1;i>=0;i--)
printf("%d",b[i]);
printf("\n");
return 0;
}

打印1到最大的n位数的更多相关文章
- 剑指Offer面试题:11.打印1到最大的n位数
一.题目:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二.不同的解法 2.1 不假思索的解法 最容易想到的办 ...
- 面试题12:打印1到最大的n位数
// 面试题12_打印1到最大的n位数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- 《剑指offer》面试题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的字符串,字符串的最后 ...
- 1515:打印1到最大的N位数 @jobdu
题目1515:打印1到最大的N位数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:625 解决:323 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一 ...
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...
- 打印1到最大的n位数-Java
在练习剑指offer的时候,第12题打印1到最大的n位数的时候,想找个java版的,但大家要么用BigInteger做,要么给出其他的方法.我觉得要给就给最好的方法,下面是我自己参考C++代码写的ja ...
- 【Java】 剑指offer(16) 打印1到最大的n位数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印 ...
- 《剑指offer》第十七题(打印1到最大的n位数)
// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...
随机推荐
- [poj 3261]Milk Patterns
后缀数组搞一下就可以了喵~ 其实这道题的第一个想法是 SAM ,建完后缀自动机后拓扑排序跑一遍统计下每个子串的出现次数就 O(N) 就妥妥过掉了 后缀树也是 O(N) 的,统计一下每个节点对应的子树中 ...
- Anroid 异常:is not valid; is your activity running?
本文转载于:http://blog.csdn.net/biangren/article/details/7514722 是由于有activity时依附于另一个activity的,当被依附的activi ...
- NodeJS记录
https://nqdeng.github.io/7-days-nodejs/#3.3.4
- jquery 自动补全控件(支持IE6)待整理
自动补全控件(兼容IE6):http://bassistance.de/ download地址:http://jquery.bassistance.de/autocomplete/jquery.aut ...
- C/C++数组名与指针的区别详解
1.数组名不是指针我们看下面的示例: #include <iostream> int main() { ]; char *pStr = str; cout << sizeof( ...
- 用一条UPDATE语句交换两列的值
在SQL UPDATE语句中,"="右侧的值在整个UPDATE语句中都是一致的,所有更新同时发生!因此以下语句将在没有临时变量的情况下交换两列的值: UPDATE table SE ...
- 使用SQL Server存储ASP.NET Session变量
创建和配置ASP.NET Session状态数据库 在基于NLB(网络负载平衡)环境下的ASP.NET Web应用程序开发,我们需要将Session存储在数据库中供多个Web应用程序调用,以下为配置方 ...
- MYSQL 获取表的列信息
SELECT COLUMN_NAME as '列名' ,DATA_TYPE as '字段类型' ,COLUMN_TYPE as '长度加类型' FROM information_schema.`COL ...
- mysql log
mysql binlog3种格式,row,mixed,statement. 解析工作 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.0001 ...
- 深入理解ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...