先贴下题目:
以及原题链接:1209. 带分数 - AcWing题库https://www.acwing.com/problem/content/1211/
然后是我的代码:
#include <iostream>
#include <cmath>
using namespace std;
double sum = 0;
int N;
int a[10];
bool b[10];
void dfs(int x, int y)
{
if (y > 9)
{
for (int i = 1; i < 8; ++i)
{
double sum1 = 0;
double d = 0, e = 0, f = 0;
for (int ii = 1; ii < i + 1; ++ii)
{
d = d * 10 + a[ii];
}
sum1 += d;
d = 0;
if (sum1 > x)
return;
for (int j = i + 1; j < 9; ++j)
{
for (int k = i + 1; k < j + 1; ++k)
e = e * 10 + a[k];
for (int k = j + 1; k < 10; ++k)
f = f * 10 + a[k];
if (fabs((double)x - (sum1 + (e / f))) < 1e-10)
sum++;
e = 0;
f = 0;
}
}
return;
}
for (int i = 1; i < 10; ++i)
if (!b[i])
{
a[y] = i;
b[i] = true;
dfs(x, y + 1);
b[i] = false;
}
}
int main()
{
cin >> N;
dfs(N, 1);
cout << sum;
return 0;
}
说实在话我写的有点丑陋,但毕竟没怎么刷过题,能一次性写成这样不错了(先自我安慰),核心是用n立方的时间复杂度套三重循环,暴力枚举出所有1-9的排列方式,然后每种方式分成三段判断是不是合法的排列方式。有点丑陋,先这样了。
by————2024.1.29刷题记录