Description
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j各代表0~9中的一个数字 除了0可以重复外,其它数字不能重复,2<=n<=90000。
输入格式
多case,每行一个数字,最后一个数字是0
输出格式
除了最后一行0不用处理, 其它每个case,按被除数由小到大输出所有满足等式的情况 注:如果没有满足条件的等式,该case结束后,也需要输出一个空行 两个case之间用一个空行分隔
输入样例
666 6666 20000 0
输出样例
27306/00041=666 41958/00063=666 43290/00065=666 52614/00079=666 53946/00081=666 63270/00095=666 20000/00001=20000 40000/00002=20000 60000/00003=20000 80000/00004=20000
个人思路:
这题就暴力枚举就好了。但是暴力也有方法,千万不要几个for循环套下来把所有的排列都枚举一次。我们已经知道n的值,如果 a / i = n,那么我们只需要从小到大枚举 i 的值就能同时得到 a 的值了。
另外,这道题是判断有无重复的,我们准备一个数组容器存放1-9的数量,当数量大于1就是重复。
#include <iostream>
using namespace std;
#include <string>
#include <cstring>
int main()
{
while(true)
{
int n;
cin >> n;
if(n==0)
return 0;
for(int i=1; ; i++)
{
int a = i*n;
if(a > 99999)
break;
bool flag = true;//标记能否输出
int arr[10];//存放数字出现的次数的容器
memset(arr, 0, sizeof(arr));
string str1 = to_string(a);
string str2 = to_string(i);
for(char ch : str1)//枚举a中的每位数
{
arr[ch-'0']++;
if(ch>'0' && arr[ch-'0'] > 1)
flag = false;
}
for(char ch : str2)//枚举i中的每位数
{
arr[ch-'0']++;
if(ch>'0' && arr[ch-'0'] > 1)
flag = false;
}
if(flag)
printf("%05d/%05d=%d\n",a,i,n);//格式化输出
}
cout << endl;
}
return 0;
}