打印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 ...
随机推荐
- 【BZOJ1007】【HNOI2008】水平可见直线
依旧看黄学长代码,不过这回是看完后自己写的 原题: 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例 ...
- 黑马程序员——JAVA基础之异常处理机制
------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...
- Android开发之多级下拉列表菜单实现(仿美团,淘宝等)
注:本文转载于:http://blog.csdn.net/minimicall/article/details/39484493 我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到 ...
- memory dump and CLR Inside Out
MSDN Magazine: CLR Inside Out https://msdn.microsoft.com/en-us/magazine/cc501040.aspx CLR Inside Out ...
- Python-描述符
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些“中级”的语 ...
- AIDL Service Android进程间通信机制
转载出处:http://www.apkbus.com/home.php?mod=space&do=blog&uid=664680&id=59465 我们知道,在Android ...
- 028. asp.net数据绑定控件值DataList控件
DataList控件可以使用模板与定义样式来显示数据并进行数据的选择, 删除及编辑工作. DataList控件的最大特点是一定要通过模板来定义数据的显示格式. 如果要设计出美观的界面, 就需要花费一番 ...
- 09-Java 工程结构管理
(一)Java 工程结构管理 1.什么是Build Path: -- 一般包括:JRE运行时库 第三方功能扩展库(*.jar 格式文件) 其他的工程 其他的源代码或Class 文件 为什么使用~ :通 ...
- awk命令拷屏
如果不指明采取什么动作,awk默认打印出所有浏览出的记录,与{print $}是一样的 模式和动作两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录. ...
- 【转】GridView中页脚汇总显示
来源:http://blog.csdn.net/atian15/article/details/3495514 有时候需要在GridView的页脚中汇总显示一些信息,常见的方法有两种: 1.在SQL中 ...