tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

虫食い算を作るプログラム

Javaでごめんなさい。

import java.util.*;

class Maker{
	static int M[];
	static int N[];
	static String center[];
	static String sum;
	static int unique;
	static int seme;
	static void solve(int k){
		//System.out.prlongln(k);
		if(k==M.length){
			seme=0;
			for(int i=0;i<M.length;i++){
				seme+=(int)Math.pow(10,M.length-1-i)*M[i]; 
			}
			solve2(N.length-1);
		}else if(M[k]==-1){
			for(int i=k==0?1:0;i<10;i++){
				M[k]=i;
				solve(k+1);
			}
			M[k]=-1;
		}else{
			solve(k+1);
		}
		return;
	} 
	static void solve2(int p){
		if(p<N.length-1){
			if(M[0]*N[0]>9&&sum.length()<M.length+N.length)return;
		}
		if(p==-1){
			int ans=0;
			for(int i=0;i<N.length;i++){
				int c=0;
				
				for(int j=0;j<M.length;j++){
					c+=Math.pow(10,M.length-j-1)*M[j]*N[i];
				}
				//System.out.prlongln("AAA");
				if(center[center.length-1-i].length()!=(int)(Math.log10(c))+1||(center[center.length-1-i].length()==1&&c==0)){
					//System.out.prlongln(center[center.length-1-i].length()+","+((long)(Math.log10(c))+1));
					return;
				}
				for(int j=0;j<center[center.length-1-i].length();j++){
					if(center[center.length-1-i].charAt((int)center[center.length-1-i].length()-1-j)!='*'&&(int)(center[center.length-1-i].charAt((int)center[center.length-1-i].length()-1-j)-'0')!=c%(int)Math.pow(10,j+1)/(int)Math.pow(10,j)){
						//System.out.prlongln(c+" "+center[center.length-1-i].charAt((int)center[center.length-1-i].length()-1-j));
						return;
					}
				}
				ans+=Math.pow(10,N.length-1-i)*c;
			}
			if(sum.length()!=(int)(Math.log10(ans))+1||(sum.length()==1&&ans==0))return ;
			unique++;
			return;
		}else if(N[p]==-1){
			
			for(int i=p==0?1:0;i<10;i++){
				
				if((!(seme*i>Math.pow(10,center[center.length-1-p].length())))&&(
					(M[M.length-1]*i%10==(int)center[center.length-1-p].charAt(center[center.length-1-p].length()-1)-'0')||
						(center[center.length-1-p].charAt(center[center.length-1-p].length()-1)=='*'))){
					N[p]=i;
					solve2(p-1);
				}
			}
			N[p]=-1;
		}else {
			solve2(p-1);
		}
		return;
	}
	public static void main(String args[]){
		int P,NP,n;
		if(args.length>0)
			n=Integer.parseInt(args[0]);
		else n=4;
		while(true){
		String a=String.valueOf(P=(int)(Math.random()*Math.pow(10,n)));
		String b=String.valueOf(NP=(int)(Math.random()*Math.pow(10,n)));
		center=new String[b.length()];
		for(int i=0;i<b.length();i++){
			center[i]=String.valueOf(NP%(int)Math.pow(10,i+1)/(int)Math.pow(10,i)*P);
			//System.out.println(center[i]);
		}
		sum=String.valueOf(P*NP);
		M=new int[a.length()];
		N=new int[b.length()];
		for(int i=0;i<a.length();i++){
			if(a.charAt(i)=='*')M[i]=-1;
			else M[i]=(int)(a.charAt(i))-'0';
		}
		for(int i=0;i<b.length();i++){
			if(b.charAt(i)=='*')N[i]=-1;
			else N[i]=(int)(b.charAt(i))-'0';
		}
		String lasta;
		String lastb;
		String[] lastc=new String[b.length()];
		String lastd;
		int size=a.length()+b.length()+sum.length();
		for(int i=0;i<b.length();i++)size+=center[i].length();
		int []t=new int[size];
		for(int i=0;i<size;i++)t[i]=i;
		for(int i=0;i<1000;i++){
			int p=(int)(Math.random()*size);
			int q=(int)(Math.random()*size);
			int arg=t[p];
			t[p]=t[q];
			t[q]=arg;
		}
		int del=0;
		while(true){
			unique=0;
			lasta=a;
			lastb=b;
			lastc=center.clone();
			lastd=sum;
			if(del==t.length)break;
			int now=t[del];
			//System.out.println(now);
			//int flag=(int)(Math.random()*(b.length()+3));
			//System.out.println(b.length());
			if((now-=a.length())<0){
				int k=now+a.length();
				M[k]=-1;
				a=a.substring(0,k)+"*"+a.substring(k+1);
			}else if((now-=b.length())<0){
				int k=now+b.length();
				N[k]=-1;
				b=b.substring(0,k)+"*"+b.substring(k+1);
			}else if((now-=sum.length())<0){
				int k=now+sum.length();
				sum=sum.substring(0,k)+"*"+sum.substring(k+1);
			}else{
				int i;
				for(i=0;(now-=center[i].length())>=0;i++);
				int k=now+center[i].length();
				center[i]=center[i].substring(0,k)+"*"+center[i].substring(k+1);
			}
			del++;
			if(del>size/2){
				solve(0);
				//System.out.println(del);
				if(unique!=1)break;
			}
			
		}
		probnum++;
		if(del*10>size*7){
			System.out.println("< "+probnum+" >");
			System.out.println(lasta);
			System.out.println(lastb);
			for(int i=0;i<b.length();i++)System.out.println(lastc[i]);
			System.out.println(lastd);
			System.out.println();
		}
		}
	}
	static int probnum=0;
}