暴力求解法 7.1简单枚举

7.1.1除法

除法

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

样例输入:

62

样例输出:

79546/01238=62

94736/01528=62


#include<iostream>
using namespace std;
bool Judge(int  d,int i)
{
int a[5], b[5], j, k;
for ( j = 0; j < 5; j++)
{
a[j] = d % 10;
d /= 10;
b[j] = i % 10;
i /= 10;
}
for (j = 0; j < 5;j++)
for (k = j+1; k < 5;k++)
if (a[j] == a[k] || b[j] == b[k])
return false;
for (j = 0; j < 5; j++)
for (k = 0; k < 5; k++)
{
if (a[j] == b[k])return false;
}
return true;
}
int main()
{
int  n, d;
while (cin >> n)
{
for (int i = 1234; i*n< 98765; i++)
{
d = n*i;
if (Judge(d, i)&&i>10000)
cout << d << "/" << i << "=" << n << endl;
 if (Judge(d,i)&&i<10000)
 cout << d << "/" << "0" << i << "=" << n << endl;
}
}
return 0;
}

这是我的解法,大家有什想法可以评论我。
7.1.2 最大乘积

输入n个元素组成的序列s,你需要找出一个乘积最大的连续子序列。如果这个最大的成绩不是正数,应输入-1(表示无解)。输入0结束输入。1<=n<=18,-10<=Si<=10

样例输入:

3

2 4 -3

样例输出:

8

20

#include<iostream>
#include<string>
using namespace std;
const int oo = 99999999;
int main()
{
int n,i,j;
long long a[18], b[18],max;
while (cin >> n)
{ memset(a, 0, sizeof(a));
a[0] = 1; max = -oo;
if (n > 10 || n < -10)break;
for (i = 1; i <=n; i++)
{
cin >> b[i];
a[i] = b[i] * a[i - 1];//将1到i个数的乘积放到a[]数组里
}
for (i = 1; i <= n; i++)//字串可能的长度
{
for (j = i; j <= n; j++)
{
if (a[j] / a[j - i]>max)
max = a[j] / a[j - i];
}
}
if (max < 0)max = -1;
cout << max << endl;
}
return 0;
}

这道,题对于我这种初学者来说很耐人寻味,它的思路是那个算出所有1-i的乘积然后 穷举串子串  比较 取出最大的那个。实在是高啊!佩服!
7.1.3 分数拆分

输入正整数k,找到所有正整数x>=y,使得1/k=1/x + 1/y

样例输入:

2

样例输出:

1/2=1/6 + 1/3

1/2=1/4 + 1/4

程序代码:

#include<iostream>
#include<iostream>
using namespace std;
int main()
{
int k;
while (cin >> k)
{
int sum = 0;
int y; float x;
for (y = 1; y <= 2 * k; y++)
{
x = (float(k*y) / float(y - k));
if ((int)x == x&&x > 0)sum++;
}
cout << sum << endl;
for ( y = 1; y <= 2 * k; y++)
{
x = (float(k*y) / float(y - k));
if ((int)x == x&&x > 0)
{
cout << "1/" << k << "=1/" << x << "+1/" << y << endl;
}
}

}
}



7.1.4双基回文数

如果一个正整数最小n至少在两个不同的进制位b1b2下都是回文数(2<=b1,b2<=10,则称n是双基回文数(注意,回文数不能包含前导零)。输入正整数S<10^9,输出比S大的最小双基回文数。

样例输入:

1600000

样例输出:

1632995

#include<iostream>
using namespace std;
bool Judge(int n, int m)//将n转换成m进制
{
int i, k=0;
int a[100], b[100];
for (i = 0;; i++)
{
a[i] = n%m;
//n /= m;
n = n / m;
if (n == 0)break;
}
k = i;
for (int j = k, i = 0; j >= 0; j--, i++)
b[i] = a[j];
b[k + 1] = '\0';
bool flag = 1;
for (i = 0;; i++)
{
if (i > (k / 2))break;
if (b[i] != b[k - i]){ flag = 0; break; }
}
if (flag)return 1;
else return 0;
}
int main()
{
int n;
while (cin >> n)
{
for (;; n++)
{int k = 0; bool flag = 0;
for (int m = 2; m <= 10; m++)
{
if (Judge(n, m)) k++;
if (k >= 2){ flag = 1; break; }
}
if (flag){ cout << n << endl; break; }
//if (n >= 1000000000)break;
}
}
return 0;
}

我真了,书上写的是s<10^6次  举例子给的是1600000!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值