package coding;
import java.util.Random;
import java.util.Scanner;
/**
* yeah,现场出题,现场coding,现场评奖,现场颁奖。 So,想来现场参加火热决赛直取ipad Air的,请先通过线上初赛题目带通配符的数:
* 给定一个带通配符问号的数W,问号可以代表任意一个一位数字。 再给定一个整数X,和W具有同样的长度。 问有多少个整数符合W的形式并且比X大? 输入格式
* 多组数据,每组数据两行,第一行是W,第二行是X,它们长度相同。在[1..10]之间. 输出格式 每行一个整数表示结果。 答题说明输入样例 36?1?8
* 236428 8?3 910 ? 5 输出样例 100 0 4 友情提醒:
* 1、本题用OJ模式答题,答题时可把下面输入框内预留的函数全部直接去掉,自己另起函数名实现本题功能。 2、因为本系统的OJ模式对于Java 和 C#
* 的支持有问题,所以本题暂不支持这两种语言挑战。
*
* @author Administrator 3月13
*/
public class TongPeiFu {
private Scanner input = new Scanner(System.in);
/*
* 暂时想到已数组对应位比较和数字嵌套循环两种貌似可行的方法,我采用数组
*/
public void dealWithNum() {
// 先接收一个输入的位数
System.out.println("请输入该数的位数:");
int n = input.nextInt();
// 随机两个n位的数,分别放进两个数组(直接随机n次0-9就行了)
Random rd = new Random();
int[] arrA = new int[n];
int[] arrB = new int[n];
int num = 0;
while (true) {
for (int i = 0; i < n; i++) {
if (rd.nextInt(2) == 0) {
// -1代表分配符,要记录下? 的个数
arrA[i] = -1;
num++;
} else {
arrA[i] = rd.nextInt(10);
}
arrB[i] = rd.nextInt(10);
}
if (num > 0) {
break;// 保证有通配符
}
}
inputStyle(arrA, arrB);
outputStyle(arrA, arrB, n, num);
}
// 输入样例
public void inputStyle(int[] arrA, int[] arrB) {
System.out.println("输入样例");
for (int a : arrA) {
if (a == -1) {
System.out.print("?");
} else {
System.out.print(a);
}
}
System.out.println();
for (int b : arrB) {
System.out.print(b);
}
}
// 输出样例(主要方法),传入数组A,数组B,位数n,通配符的个数
// 要求出符合数组A比B大的所有可能的数目
public void outputStyle(int[] arrA, int[] arrB, int n, int num) {
int answer = 0;// 记录当前的结果
boolean flag = false;// 标记是否出现了通配符,默认没出现
// 遍历两个数组,将对应位置进行比较
for (int i = 0; i < n; i++) {
if (arrA[i] > arrB[i]) {
// 如果当前位置A比B大(A不是通配符),可以得到结果退出循环了
// 但是要判断之前有无产生结果以及加上已有的结果
// 10的num次方
int temp = 1;
for (int j = 0; j < num; j++) {
temp = temp * 10;
}
// 只要出现过通配符,不管num是否为0,都要加上一次当前的情况
if (flag) {
if (temp == 1) {
// 此时num为0,temp该为0
answer = answer + temp;
} else {
answer = answer + temp + 1;
}
} else {
// 若没出现过,那么不加1
if (temp != 1) {
answer = answer + temp;
}
}
break;
}
if ((arrA[i] < arrB[i]) && (arrA[i] != -1)) {
break;
}
if (arrA[i] == -1) {
flag = true;
num--;// 当前的通配符可以舍去了
int f = 9 - arrB[i];// 记录当前位置A大于B的可能数
// 如果f>0才进行后面的判断
if (f > 0) {
// 看数组后面还有无通配符
if (num > 0) {
int temp = 1;
for (int j = 0; j < num; j++) {
temp = temp * 10;
}
// 记录确定的满足条件的可能数
temp = temp * f;
answer = answer + temp;
} else {
answer = answer + f;
}
}
}
}
System.out.println();
System.out.println("输出样例");
System.out.println(answer);
}
public static void main(String[] args) {
TongPeiFu t = new TongPeiFu();
t.dealWithNum();
}
}