暴力破解,百度文库 https://wenku.baidu.com/view/475a6bde7f1922791688e84d.html
例题7-1 除法
除法
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2≤n≤79。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62
【分析】
只需要枚举fghij就可以计算出abcde,然后判断是否所有数字都不相同即可。不仅程序简单,而枚举量也从10!=3628800降低至不到1万。由此可见,即使采用暴力枚举,也是需要认真分析问题。
#include <iostream>
using namespace std;
bool test(int i,int j){ //用数组t存放i,j的各位数字
int t[10]={0}; //初始化数组t,使得各位数字为0,好处是使得fghij<10000时f位置为0
int ia = 0;
while(i) { //取i中各位数字存放在数组t中
t[ia++] = i % 10;
i = i / 10;
}
while(j) { //取j中各位数字存放在数组t中
t[ia++] = 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;
while(k <= 98765) {
int j = k * n;
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;
}
例题7-2 最大乘积
#include<iostream>
#include<algorithm>
using namespace std;
long long int a[20];
int n;
int kase=0;
void solve(){
while(cin>>n){
for(int i=0;i<n;i++) cin>>a[i];
long long int mmax=0;
for(int i=1;i<=n;i++){ //枚举连续子序列的长度
for(int j=0;j<=n-i;j++){ //枚举连续子序列的起点
long long int t=1;
for(int k=j;k<j+i;k++){ //累乘
t*=a[k];
}
mmax=max(mmax,t);
}
}
cout<<"Case #"<<++kase<<": The maximum product is "<<mmax<<"."<<endl<<endl;
}
}
int main()
{
solve();
return 0;
}
和下面这个结合一下:::
#include <cstdio>
#include <cstring>
#define ll long long
int a[20], n, cnt;
int main(void){
for (cnt = 1;~scanf("%d", &n);cnt++){
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
ll S = 1, maxn = 0;
for (int i = 1; i <= n; i++){
S = 1;//忘记
for (int j = i; j <= n; j++){
S *= a[j];
if (S > maxn){
maxn = S;
}
}
}
if (maxn < 0){
maxn = 0;
}
printf("Case #%d: The maximum product is %lld.\n\n", cnt, maxn);
getchar();
}
return 0;
}