62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.Scanner;
/**
* 4个数。
* 1<=n1,n1<n2,n2<1000000000,0<=a<=9,0<=b<=9,a!=b
* 求在n1--n2之间不含a,但是含有b的数字有到多少个?要求用算法,10秒能出来= =
* 当n1=1,n2=999999999时要求10秒算出结果。
* @author Administrator
*
*/
public class Test3 {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入n1(0<=n1<1000000000):");
int n1 = sc.nextInt();
// String n1Num = ""+n1;
int n1N = (""+n1).length();
System.out.println("请输入n2(n1<n2<1000000000):");
int n2 = sc.nextInt();
// String n2Num = ""+n2;
int n2N = (""+n2).length();
System.out.println("请输入a和b,0<=a<=9,0<=b<=9,且a不等于b,a与b用逗号隔开:");
String ab = sc.next();
int a = Integer.valueOf((ab.split(",")[0]));
int b = Integer.valueOf((ab.split(",")[1]));
sc.close();
int count = 0;
if(n1N==n2N){
count = front(n1,a,b)-front(n2,a,b);
}
else{
count = front(n1,a,b);
for(int i=n1N+1;i<=n2N;i++){
count = count + exe(i,a,b);
}
count = count - front(n2,a,b);
}
System.out.println(count);
// System.out.println(c(5,3));
// System.out.println(nFactorial(4));
// System.out.println(exe(2,a,b));
// System.out.println(power(2,3));
// System.out.println(add(false,3,2,4,5));
// System.out.println(front(23,4,5));
}
/**
* 计算n位数中含b,不含a的数的个数
* @param n:数的位数
* @param a:不含的数字
* @param b:必须含的数字
* @return
*/
public static int exe(int n,int a,int b){
int count=0;
if(b==0){
if(n==1){
count=1;
}
else{
for(int i=1;i<n;i++){
count=count+power(8,n-i)*c((n-1),i);
}
}
}
else if(a==0){
for(int i=1;i<=n;i++){
count=count+power(8,n-i)*c(n,i);
}
}
else{
for(int i=1;i<n;i++){
count=count+7*power(8,n-i-1)*c(n-1,i);
}
for(int i=0;i<n;i++){
if(i==0){
count=count+power(8,n-1);
}
else{
count=count+power(8,n-1-i)*c(n-1,i);
}
}
}
return count;
}
/**
* a的n次方
* @param a
* @param n
* @return
*/
public static int power(int a,int n){
int res = 1;
while(n>0){
res = res * a;
n--;
}
return res;
}
/**
* 排列组合中c(n,m)
* @param n
* @param m
* @return
*/
public static int c(int n,int m){
int res = 1;
int mm = m;
for (; mm > 0; mm--)
{
res *= n;
n--;
}
return (res / nFactorial(m));
}
/**
* n的阶乘
* @param n
* @return
*/
public static int nFactorial(int n){
int res = 1;
for (; n > 0; n--)
{
res *= n;
}
return res;
}
/**
*
* @param n:数字
* @param N:n所在的位(即个位、十位、百位等)
* @return
*/
public static int add(boolean TorF,int n,int N,int a,int b){
int count = 0;
for(int i=n;i<10;i++){
if(i==a){
continue;
}
else{
if(TorF){
if (N == 1) {
count++;
continue;
}
else {
count = count + power(9,N-1);
}
}
else{
if (N == 1) {
if(i==b){
count ++;
}
}
else{
if(i==b){
count = count + power(9,N-1);
}
else{
for(int j=1;j<N;j++){
count = count + c(N-1,j)*power(8,N-1-j);
}
}
}
}
}
}
return count;
}
/**
* 计算n1到相同位数最大值之间满足条件的数的个数(如123~999满足条件的数的个数)
* @param n1
* @param a
* @param b
* @return
*/
public static int front(int n1,int a,int b){
int count = 0;
String start = ""+n1;
int N = start.length();
int[] startnum = new int[N];
for(int i=0;i<N;i++){
startnum[i] =Integer.parseInt(String.valueOf(start.charAt(N-1-i)));
}
int aa = -1;
for(int i=N-1; i>0; i--){
if(startnum[i]==a){
aa = i;
break;
}
}
if(aa!=-1){
if(aa==N-1){
if(startnum[aa]==9){
count = 0;
}
else{
count = count + add(false,startnum[aa]+1,aa+1,a,b);
}
}
else{
boolean TorF = false;
for(int i=aa+1;i<N;i++){
if(startnum[i]==b){
TorF = true;
break;
}
}
if(startnum[aa]==9){
count = 0;
}
else{
count = count + add(TorF,startnum[aa]+1,aa+1,a,b);
}
for(int i=aa+1;i<N;i++){
if(startnum[i]==9){
continue;
}
else{
if(i==N-1){
count = count + add(false,startnum[i]+1,i+1,a,b);
}
else{
boolean TORF = false;
for(int j=i+1;j<N;j++){
if(startnum[j]==b){
TORF = true;
break;
}
}
count = count + add(TORF,startnum[i]+1,i+1,a,b);
}
}
}
}
}
else{
for(int i=0;i<N;i++){
if(startnum[i]==9){
continue;
}
if(i==N-1){
count = count + add(false,startnum[i]+1,i+1,a,b);
break;
}
else{
boolean TorF = false;
for(int j=i+1;j<N;j++){
if(startnum[j]==b){
TorF = true;
break;
}
}
count = count + add(TorF,startnum[i]+1,i+1,a,b);
}
}
}
return count;
}
}
个人测试了几组数据,感觉还可以,不知道能满足楼主的要求不。。。????