package test;
/**
* @time 2014-3-13
* @encode UTF-8
* @question 给定一个带通配符问号的数W,问号可以代表任意一个一位数字。
* 再给定一个整数X,和W具有同样的长度。
* 问有多少个整数符合W的形式并且比X大?
* */
public class Algo_1 {
/**
* @param num 给定整数
* @param pattern 包含通配符的数
* */
public static int howMany(String num,String pattern){
int pn=0,r=0;//pn 通配符的个数,r 所求整数个数
for(int j=0;j<pattern.length();j++)
if(pattern.charAt(j)==TPF)
pn++;
for(int j=0;j<pattern.length();j++){
char cp=pattern.charAt(j),cn=num.charAt(j);
if(cp==TPF){
pn--;
r+=('9'-cn)*pow10(pn);
}else if(cp<cn)
return r;
else if(cp>cn)
return r+pow10(pn);
}
return r;
}
/**@param e 指数,且e>=0
* @return 10^e
* */
private static int pow10(int e){
int r=1;
while(e-->0)
r*=10;
return r;
}
private static final char TPF='?';//通配符
}
测试程序如下:
package test;
import static org.junit.Assert.*;
import org.junit.Test;
public class Algo_1Test {
@Test
public void testHowMany() {
assertEquals(Algo_1.howMany("5", "?"),4);
assertEquals(Algo_1.howMany("50", "??"),49);
assertEquals(Algo_1.howMany("801", "7?0"),0);
assertEquals(Algo_1.howMany("236428", "36?1?8"),100);
}
}