@javaブルーブリッジ・カップ・グループB前回の演習Zhenti:PREV-041 Excelのアドレスの問題
問題の説明
Excelのセルアドレスは、列番号を表すために文字を使用して、非常に興味深いを示しています。
例えば、
Aは、最初の列を表す。1、
Bは2を表し、
Zは26を表し、
AAは27を表し、
ABは、28を表し
、BAは53を表し、
...
変換することは難しいことではありませんので、もちろん、Excelの最大列数は、限定されています。
私たちは、これが一般的な方法を表したい場合は、大きな数は手紙それの長い列に変換されて置くことができますか?
入力、アドレス表現Excelを対応する出力の必要数あるタイトル。
入力サンプル
26
サンプル出力
Z
サンプル入力
2054
サンプル出力
BZZの
データサイズと表記
我々は入力範囲の整数で合意[1,2147483647]
(仮想マシンを含む)ピークメモリ消費量<256M
CPU消費量<1000ミリ秒
「入力してください...」不要なコンテンツ:厳密に出力の要件に従ってください、余計ないようなものを印刷します。
注:
主な機能は、0を返す必要があり、
使用が唯一のANSI C / ANSI C ++標準、
特別な機能を呼び出すことはありませんビルド環境やオペレーティングシステムに依存します。
すべての機能は、ソースファイルで明示的に依存する#includeがあることが必要
省略されている共通ヘッダを操作することによって提供することができません。
提出プロセスは、注意を払うには、希望する言語とコンパイラ型のタイプを選択した場合。
------------------------------
愚かな何かを言うために:
それはない正確に、種類のバイナリの関係などからです。26ビットが1端3 26 * 26であるときに、2つの端部は、1であるかのよう
:言うことYY何か
数字が逆さま少しトラブルが、どのように高速なコンピュータが実行ダウン、文字の配列からより良いポイントを有効にした場合。
この方法は、見て比較することができ、ここに置い、鉱山ではありません、
コード:
import java.util.ArrayList;
import java.util.Scanner;
public class PREV041EXCEL地址 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] iA = new int[5000];
int n = in.nextInt();
int N=n;
int i = 1;
while (n != 0) {
if (n % 26 == 0) {
// +64转大写字母,+96转小写字母
iA[i] = 26 + 64;
n -= 1;
} else {
iA[i] = n % 26 + 64;
}
n /= 26;
i++;
}
for (int j = i - 1; j > 0; j--) {
System.out.print((char)iA[j]);
}
System.out.println( );
System.out.println("===================================");
//方法二:
ArrayList<Integer> list=new ArrayList<Integer>();
while(N>26){
if(N%26==0){
list.add(0);
N=N/26-1;
}else{
list.add((int)N%26);
N=N/26;
}
}
list.add((int)N);
int a[]=new int[list.size()];
for(int d=0;d<list.size();d++){
a[d]=list.get(d);
}
for(int d=0;d<a.length/2;d++){
int t=0;
t=a[d];
a[d]=a[a.length-1-d];
a[a.length-1-d]=t;
}
char c[]=new char[a.length];
for(int d=0;d<c.length;d++){
if(a[d]==0){
c[d]='Z';
}else{
c[d]=(char)(a[d]+64);
}
}
for(int d=0;d<c.length;d++){
System.out.print(c[d]);
}
}
}