输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2≤n≤79。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62
【分析】
只需要枚举fghij就可以计算出abcde,然后判断是否所有数字都不相同即可。不仅程序简单,而枚举量也从10!=3628800降低至不到1万。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62
【分析】
只需要枚举fghij就可以计算出abcde,然后判断是否所有数字都不相同即可。不仅程序简单,而枚举量也从10!=3628800降低至不到1万。
#include <iostream> #include<string.h> using namespace std; bool test(int i,int j) //用数组t存放i,j的各位数字 { int t[10]; memset(t,0,sizeof(t)); //初始化数组t,使得各位数字为0,好处是使得fghij<10000时f位置为0 int w = 0; while(i) //取i中各位数字存放在数组t中 { t[w++] = i % 10; i = i / 10; } while(j) //取j中各位数字存放在数组t中 { t[w++] = j % 10; j = j / 10; } //判断a~j是否恰好为数字的0~9的一个排列 for(int m = 0; m < 10; ++m) for(int n = m+1; n < 10; ++n) if(t[n] == t[m]) return false; return true; } int main() { int n; int k; while(cin >> n && n >=2 && n <= 79) { k = 1234;//K表示分母、并且k最小为1234.最大为98765 while(k <= 98765) { int j = k * n;//j表示分子 if(j < 100000) //若fghij<10000,满足题目的条件,f位置输出0 { if(test(j,k)) { cout << j << "/" ; if(k < 10000) cout <<"0"; cout << k << "=" << n <<endl; } } k++; } } return 0; }
转载于:https://blog.51cto.com/bingsanchun/1271306