程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 枚舉與剪枝_觀察算式(比標准答案還要牛B)

枚舉與剪枝_觀察算式(比標准答案還要牛B)

編輯:C++入門知識

觀察算式

觀察下面的算式:

△△△ * △△ = △△△△

某3位數乘以2位數,結果為4位數

要求:在9個△所代表的數字中,1~9的數字恰好每個出現1次。

暴力破解代碼:

package lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class lianxi028 {

	public static void main(String[] args) {
		Set set = new HashSet();
		long pre = System.currentTimeMillis();
		int a1 ;
		int a2 ;
		int a3 ;
		int a4 ;
		int a5 ;
		int a6 ;
		int a7 ;
		int a8;
		int a9 ;
		 for (int i = 102; i <= 999; i++) {
				a1 =i / 100;
				a2 =i / 10 % 10;
				a3 =i % 10;
				
//			if (a1 * a2* a3 == 0)
//				continue ;// 如果包含0就退出
//			if (a1== a2|| a2== a3
//					|| a1 == a3)
//				continue ;// 如果他們中有一對是相等就退出
			L2: for (int j = 10; j <= 99; j++) {
				set.add(a1);
				set.add(a2);
				set.add(a3);
				a4 =j / 10;
				a5 =j % 10;
//				if (a4*a5 == 0){
//					set.clear();
//					continue L2;// 如果包含0就進行下一輪循環
//				}
//				if (a4 == a5)
//				{
//					set.clear();
//					continue L2;// 如果他們中有一對是相等就進行下一輪循環
//				}

				int k = i * j;
				if (k >= 1023 && k <= 9999) {// 如果他們的結果是4位不重復數字
					a6=k / 1000;
					a7=k / 100 % 10;
					a8=k / 10 % 10;
					a9=k % 10;
					set.add(a4);
					set.add(a5);
					set.add(a6);
					set.add(a7);
					set.add(a8);
					set.add(a9);
					if (set.contains(0))
						set.clear();
					if (set.size() == 9) {// SET集合裡一共有9個元素說明找到了9個不重復的數字
						System.out.println(i + "*" + j + "=" + k);
					}

				}
				set.clear();// 清除
			}
		}
		System.out.println(System.currentTimeMillis() - pre);

	}
}

運行時間是46毫秒。

做了減枝判斷後代碼

package lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class lianxi028 {

	public static void main(String[] args) {
		Set set = new HashSet();
		long pre = System.currentTimeMillis();
		int a1 ;
		int a2 ;
		int a3 ;
		int a4 ;
		int a5 ;
		int a6 ;
		int a7 ;
		int a8;
		int a9 ;
		 for (int i = 102; i <= 999; i++) {
				a1 =i / 100;
				a2 =i / 10 % 10;
				a3 =i % 10;
				
			if (a1 * a2* a3 == 0)
				continue ;// 如果包含0就退出
			if (a1== a2|| a2== a3
					|| a1 == a3)
				continue ;// 如果他們中有一對是相等就退出
			L2: for (int j = 10; j <= 99; j++) {
				set.add(a1);
				set.add(a2);
				set.add(a3);
				a4 =j / 10;
				a5 =j % 10;
				if (a4*a5 == 0){
					set.clear();
					continue L2;// 如果包含0就進行下一輪循環
				}
				if (a4 == a5)
				{
					set.clear();
					continue L2;// 如果他們中有一對是相等就進行下一輪循環
				}

				int k = i * j;
				if (k >= 1023 && k <= 9999) {// 如果他們的結果是4位不重復數字
					a6=k / 1000;
					a7=k / 100 % 10;
					a8=k / 10 % 10;
					a9=k % 10;
					set.add(a4);
					set.add(a5);
					set.add(a6);
					set.add(a7);
					set.add(a8);
					set.add(a9);
					if (set.contains(0))
						set.clear();
					if (set.size() == 9) {// SET集合裡一共有9個元素說明找到了9個不重復的數字
						System.out.println(i + "*" + j + "=" + k);
					}

				}
				set.clear();// 清除
			}
		}
		System.out.println(System.currentTimeMillis() - pre);

	}
}
運行時間是32毫秒

最優的標准答案是:

package lianxijihe;
public class lianxi012
{
	public static void main(String[] args)
	{
		long pre = System.currentTimeMillis();
		for(int x=10; x<100; x++){
			int a = x/10;
			int b = x%10;
			if(a==0 || b==0 || a==b) continue;
L1:			for(int y=100; y<1000; y++){
				int c = y / 100;
				int d = y % 100 / 10;
				int e = y % 10;
				if(c*d*e==0) continue;
				if(c==a || c==b) continue;
				if(d==a || d==b || d==c) continue;
				if(e==a || e==b || e==c || e==d) continue;
				
				int z = x * y;
				if(z<1000 || z>=10000) continue; // 結果不是4位數
				
				// 分解為位
				int[] r = new int[4];
				for(int i=0; ipackage lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class lianxi028 {

	public static void main(String[] args) {

		int a1;
		int a2;
		int a3;
		int a4;
		int a5;
		int a6;
		int a7;
		int a8;
		int a9;
		long pre = System.nanoTime(); 
		for (int i = 102; i <= 987; i++) {
			a1 = i / 100;
			a2 = i / 10 % 10;
			a3 = i % 10;

			if (a1 * a2 * a3 == 0)
				continue;// 如果包含0就退出
			if (a1 == a2 || a2 == a3 || a1 == a3)
				continue;// 如果他們中有一對是相等就退出
			L2: for (int j = 10; j <= 98; j++) {
				int k = i * j;
				
				if (k >= 1023 && k <= 9876) {

					a4 = j / 10;
					a5 = j % 10;
					if (a4 * a5 == 0) {
						continue L2;// 如果包含0就進行下一輪循環
					}
					if (a4 == a5 || a4 == a1 || a4 == a2 || a4 == a3
							|| a5 == a1 || a5 == a2 || a5 == a3) {
						continue L2;// 如果他們中有一對是相等就進行下一輪循環
					}

				

					a6 = k / 1000;
					a7 = k / 100 % 10;
					a8 = k / 10 % 10;
					a9 = k % 10;
					if(a9%2!=0)continue L2;
					if (a6 * a7 * a8 * a9 == 0) {
						continue L2;
					}
					if (a6 == a1 || a6 == a2 || a6 == a3 || a6 == a4
							|| a6 == a5 || a7 == a1 || a7 == a2 || a7 == a3
							|| a7 == a4 || a7 == a5 || a7 == a6) {
						continue L2;
					}
					if (a8 == a1 || a8 == a2 || a8 == a3 || a8 == a4
							|| a8 == a5 || a8 == a6 || a8 == a7) {
						continue L2;
					}
					if (a9 == a1 || a9 == a2 || a9 == a3 || a9 == a4
							|| a9 == a5 || a9 == a6 || a9 == a7 || a9 == a8) {
						continue L2;
					}
						System.out.println(i + "*" + j + "=" + k);

				}

			}
		}
		System.out.println(System.nanoTime() - pre);

	}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved