算法竞赛入门经典:第七章 暴力求解法 7.1除法

/*
除法:
输入正整数,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79.
输入:
62
输出:
79546/01283=62
94736/01528=62

思路:
暴力解决:罗列所有可能性,一一实验
枚举原则:枚举简单的东西:整数,子串
本题:应该枚举被除数,5个数字,那么除数算出来之后,看是否有重复的即可
*/

/*
关键:
1 暴力解决:罗列所有可能性,一一实验 
2 枚举原则:枚举简单的东西:整数,子串
3 应该枚举被除数,5个数字,那么除数算出来之后,看是否有重复的即可,不要傻不拉几的枚举10!种
*/
#include <stdio.h>
#include <stdlib.h>



void division(int n)
{
	if( n <2 || n >79)
	{
		printf("您输入的n不符合要求(2<=n<=79),请重新输入!\n");
		return;
	}
	for(int i = 98765/79; i <= 98765/2; i++)//因为被枚举的数最多不会超过最大数的一半
	{
		int iMark[10] = {0};//用于标记是否有重复元素
		//将数i进行分解
		//这里要加判断,如果被除数小于10000,默认iMark[0] = 1;
		if(i < 10000)
		{
			iMark[0] = 1;
		}
		int k = i;
		int iProduct;
		bool isOk = true;
		do{
			int temp = k % 10;//分解个位
			if(iMark[temp] == 1)
			{
				isOk = false;
				break;
			}
			else
			{
				iMark[temp] = 1;
			}
			k /= 10;
		}while(k);
		if(isOk == false)
		{
			continue;
		}
		else
		{
			iProduct = n * i;
			int p = iProduct;
			do{
				int temp = p % 10;
				if(1 == iMark[temp])
				{
					isOk = false;
					break;
				}
				else
				{
					iMark[temp] = 1;
				}
				p /= 10;
			}while(p);
		}
		if(isOk)
		{
			//这里要对被除数若小于10000,要前置添加0
			if(i < 10000)
			{
				printf("%d/0%d = %d\n",iProduct,i,n);
			}
			else
			{
				printf("%d/%d = %d\n",iProduct,i,n);
			}
		}
	}
}

int main(int argc,char* argv[])
{
	int n;
	scanf("%d",&n);
	division(n);
	system("pause");
	return 0;
}

你可能感兴趣的:(枚举)