62,620
社区成员
发帖
与我相关
我的任务
分享
package com.test;
public class FindNumber {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int num=1253;
int length=(num+"").length();
int possition=0;
////规律
/*if (length==1) {
possition=num;
}
if (length==2) {
possition=10+(num-10)*2;
}
if (length==3) {
possition=(10-0)*1+(100-10)*2+(num-100)*3;
}
if (length==4) {
possition=(10-0)*1+(100-10)*2+(1000-100)*3+(num-1000)*4;
}
System.out.println(possition);
possition=0;*/
for (int i = 1; i <length; i++) {
possition+=(power(i)-power(i-1))*i;
}
System.out.println(possition);
possition=possition+(num-power(length-1))*length;
System.out.println(possition);
}
public static int power(int i){
if (i==0) {
return i;
}
int b=1;
for (int j = 0; j < i; j++) {
b=b*10;
}
return b;
}
}
package quiz;
import java.io.*;
public class Headache {
private String analysis;
private int digits;
private int rstOffset, rstDiv;
private long rstIndex = Long.MAX_VALUE;
Headache(String src) {
analysis = src;
digits = src.length();
}
public void analyse() {
boolean find = false;
if (Long.parseLong(analysis) == 0) {
rstOffset = -1;
rstDiv = digits + 1;
rstIndex = calIndex(-1, digits + 1);
}
for (int n = 1; n <= digits; n++) {
// 对同一个n的不同offset匹配结果须比较大小
if (find) {
return;
}
inner1: for (int offset = 0; offset < n; offset++) {
int i = n; // 当前最高位数
int index = 0; // 当前索引
boolean carry = false; // 是否产生进位
String pre;
String suc;
if (offset != 0) {
pre = analysis.substring(0, offset);
index += offset;
} else {
pre = analysis.substring(0, i);
index += i;
}
if (hasLeadingZero(pre) && offset == 0) {
continue inner1;
}
if (isMax(pre) && offset == 0) {
i++;
carry = true;
}
while (true) {
if (index + i >= digits) {
if (offset == 0 && n == digits) {
if (!hasLeadingZero(analysis)) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
continue inner1;
}
if (index == digits) {
if (calIndex(offset, n) < rstIndex) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
continue inner1;
}
suc = analysis.substring(index, digits);
if (hasLeadingZero(suc)) {
continue inner1;
}
if (carry) {
if (suc.equals(suc.replaceAll("\\d", "0")
.replaceFirst("\\d", "1"))) {
if (calIndex(offset, n) < rstIndex) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
}
} else {
if (offset != 0 && index == offset) {
if (suc.length() - (digits - n) < 0
|| n == digits) {
if (calIndex(offset, n) < rstIndex) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
} else if (String.format(
String.format("%%0%dd", n),
Long.parseLong(pre) + 1).substring(
suc.length() - (digits - n),
suc.length()).equals(
suc.substring(suc.length()
- (digits - n), suc.length()))) {
if (calIndex(offset, n) < rstIndex) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
}
continue inner1;
}
if (String.valueOf(Long.parseLong(pre) + 1)
.substring(0, suc.length()).equals(suc)) {
if (calIndex(offset, n) < rstIndex) {
rstOffset = offset;
rstDiv = n;
rstIndex = calIndex(offset, n);
find = true;
}
}
}
continue inner1;
}
suc = analysis.substring(index, index + i);
if (hasLeadingZero(suc)) {
continue inner1;
}
if (carry) {
if (!suc.equals(suc.replaceAll("\\d", "0")
.replaceFirst("\\d", "1"))) {
continue inner1;
} else {
carry = false;
}
} else {
if (offset != 0 && index == offset) {
if (!String.format(String.format("%%0%dd", n),
Long.parseLong(pre) + 1).substring(
n - offset, n).equals(
suc.substring(n - offset, n))) {
continue inner1;
}
} else {
if (!String.valueOf(Long.parseLong(pre) + 1)
.equals(suc)) {
continue inner1;
}
}
}
index += i;
if (isMax(suc)) {
i++;
carry = true;
}
pre = suc;
}
}
}
}
public boolean hasLeadingZero(String test) {
return test.charAt(0) == '0';
}
public boolean isMax(String test) {
return test.equals(test.replaceAll("\\d", "9"));
}
public String getFstNum(int argOffset, int argDiv) {
if (argDiv == digits + 1) {
return "1" + analysis;
}
String tmpOne;
if (argOffset + argDiv > digits) {
int len = argDiv - (digits - argOffset);
String tmp = String.format(String.format("%%0%dd", len),
Long.parseLong(analysis.substring(argOffset - len,
argOffset)) + 1);
tmpOne = analysis.substring(argOffset, digits)
+ tmp.substring(tmp.length() - len, tmp.length());
} else {
tmpOne = analysis.substring(argOffset, argOffset + argDiv);
}
return tmpOne;
}
public long calIndex(int argOffset, int argDiv) {
String tmpTwo = getFstNum(argOffset, argDiv);
long total = 0;
for (int i = 1; i < tmpTwo.length(); i++) {
total += 9 * i * Math.pow(10, i - 1);
}
total += tmpTwo.length()
* (Long.parseLong(tmpTwo) - Math.pow(10, tmpTwo.length() - 1));
total -= argOffset;
return total;
}
public void Print() {
analyse();
System.out.println("the input String: " + analysis);
System.out.println("the first extracted number is "
+ getFstNum(rstOffset, rstDiv) + " rstOffset(在输入串中出现的位置): "
+ rstOffset + " rstDiv(位数):" + rstDiv);
System.out.println("the position of first appearance is "
+ (rstIndex + 1));
}
public static void main(String[] args) throws IOException {
// 空行或 Ctrl - Z 结束程序
BufferedReader stdin = new BufferedReader(new InputStreamReader(
System.in));
String s;
while ((s = stdin.readLine()) != null && s.length() != 0) {
Headache tm = new Headache(s);
tm.Print();
}
}
}