solution.md 4.3 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 带分数
F
fix bug  
feilong 已提交
2

3
**问题描述**
F
fix bug  
feilong 已提交
4

每日一练社区's avatar
每日一练社区 已提交
5 6 7 8 9 10 11 12
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

还可以表示为:100 = 82 + 3546 / 197。

注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

类似这样的带分数,100 有 11 种表示法。

13
**输入格式**
F
fix bug  
feilong 已提交
14

每日一练社区's avatar
每日一练社区 已提交
15 16
从标准输入读入一个正整数N (N<1000*1000)

17
**输出格式**
F
fix bug  
feilong 已提交
18

每日一练社区's avatar
每日一练社区 已提交
19 20 21 22
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法!

23
**样例输入1**
F
fix bug  
feilong 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25 26 27
```
100
```
28
**样例输出1**
F
fix bug  
feilong 已提交
29

每日一练社区's avatar
每日一练社区 已提交
30 31 32
```
11
```
33
**样例输入2**
F
fix bug  
feilong 已提交
34

每日一练社区's avatar
每日一练社区 已提交
35 36 37
```
105
```
38
**样例输出2**
F
fix bug  
feilong 已提交
39

每日一练社区's avatar
每日一练社区 已提交
40 41 42 43
```
6
```

每日一练社区's avatar
每日一练社区 已提交
44 45
以下错误的一项是?

每日一练社区's avatar
每日一练社区 已提交
46
## aop
F
fix bug  
feilong 已提交
47

每日一练社区's avatar
每日一练社区 已提交
48
### before
F
fix bug  
feilong 已提交
49

每日一练社区's avatar
每日一练社区 已提交
50
```cpp
每日一练社区's avatar
每日一练社区 已提交
51 52
#include <bits/stdc++.h>
using namespace std;
每日一练社区's avatar
每日一练社区 已提交
53 54 55

```
### after
F
fix bug  
feilong 已提交
56

每日一练社区's avatar
每日一练社区 已提交
57
```cpp
每日一练社区's avatar
每日一练社区 已提交
58

每日一练社区's avatar
每日一练社区 已提交
59 60 61
```

## 答案
F
fix bug  
feilong 已提交
62

每日一练社区's avatar
每日一练社区 已提交
63
```cpp
每日一练社区's avatar
每日一练社区 已提交
64
int main()
每日一练社区's avatar
每日一练社区 已提交
65
{
每日一练社区's avatar
每日一练社区 已提交
66 67 68 69
    int n, ans = 0;
    scanf("%d", &n);
    string s = "123456789";
    do
每日一练社区's avatar
每日一练社区 已提交
70
    {
每日一练社区's avatar
每日一练社区 已提交
71
        for (int i = 1; i <= 7; ++i)
每日一练社区's avatar
每日一练社区 已提交
72
        {
每日一练社区's avatar
每日一练社区 已提交
73 74 75 76
            string a = s.substr(0, i);
            int inta = atoi(a.c_str());
            if (inta >= n)
                break;
每日一练社区's avatar
每日一练社区 已提交
77

每日一练社区's avatar
每日一练社区 已提交
78 79 80 81 82 83 84 85
            for (int j = i; j <= 9 - i; ++j)
            {
                string b = s.substr(i, j);
                string c = s.substr(i + j);
                int intb = atoi(b.c_str());
                int intc = atoi(c.c_str());
                if (intb % intc == 0 && inta + intb / intc == n)
                    ans++;
每日一练社区's avatar
每日一练社区 已提交
86 87
            }
        }
每日一练社区's avatar
每日一练社区 已提交
88 89 90
    } while (next_permutation(s.begin(), s.end()));
    printf("%d\n", ans);
    return 0;
每日一练社区's avatar
每日一练社区 已提交
91 92 93 94
}
```
## 选项

F
fix bug  
feilong 已提交
95

每日一练社区's avatar
每日一练社区 已提交
96
### A
F
fix bug  
feilong 已提交
97

每日一练社区's avatar
每日一练社区 已提交
98
```cpp
每日一练社区's avatar
每日一练社区 已提交
99 100 101 102 103
int visit[10] = {0};
int s[10];
int ans = 0;
int N;
void found(int s[])
每日一练社区's avatar
每日一练社区 已提交
104
{
每日一练社区's avatar
每日一练社区 已提交
105 106
    int x, y, z;
    for (int i = 1; i < 9; i++)
每日一练社区's avatar
每日一练社区 已提交
107
    {
每日一练社区's avatar
每日一练社区 已提交
108
        for (int j = i + 1; j < 9; j++)
每日一练社区's avatar
每日一练社区 已提交
109
        {
每日一练社区's avatar
每日一练社区 已提交
110 111
            x = y = z = 0;
            for (int k = 0; k < 9; k++)
每日一练社区's avatar
每日一练社区 已提交
112
            {
每日一练社区's avatar
每日一练社区 已提交
113 114 115 116 117 118 119 120 121 122
                if (k < i)
                    x = x * 10 + s[k + 1];
                else if (k < j)
                    y = y * 10 + s[k + 1];
                else
                    z = z * 10 + s[k + 1];
            }
            if (y % z == 0 && x + y / z == N)
            {
                ans++;
每日一练社区's avatar
每日一练社区 已提交
123 124 125
            }
        }
    }
每日一练社区's avatar
每日一练社区 已提交
126 127 128 129 130 131
}

void dfs(int pos, int n)
{
    if (pos == n)
        found(s);
每日一练社区's avatar
每日一练社区 已提交
132 133
    else
    {
每日一练社区's avatar
每日一练社区 已提交
134
        for (int i = 1; i <= 9; i++)
每日一练社区's avatar
每日一练社区 已提交
135
        {
每日一练社区's avatar
每日一练社区 已提交
136 137 138 139 140 141 142
            if (!visit[i])
            {
                s[pos] = i;
                visit[i] = 1;
                dfs(pos + 1, n);
                visit[i] = 0;
            }
每日一练社区's avatar
每日一练社区 已提交
143 144 145
        }
    }
}
每日一练社区's avatar
每日一练社区 已提交
146 147 148 149 150 151 152 153
int main()
{
    cin >> N;
    dfs(1, 10);
    cout << ans << endl;
    return 0;
}

每日一练社区's avatar
每日一练社区 已提交
154 155 156
```

### B
F
fix bug  
feilong 已提交
157

每日一练社区's avatar
每日一练社区 已提交
158
```cpp
每日一练社区's avatar
每日一练社区 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171
int parse(const char *arr, int pos, int len)
{
    int ans = 0;
    int t = 1;
    for (int i = pos + len - 1; i >= pos; i--)
    {
        ans += (arr[i] - '0') * t;
        t *= 10;
    }
    return ans;
}

int main()
每日一练社区's avatar
每日一练社区 已提交
172
{
每日一练社区's avatar
每日一练社区 已提交
173 174 175 176 177
    int N;
    cin >> N;
    int ans = 0;
    string s = "123456789";
    do
每日一练社区's avatar
每日一练社区 已提交
178
    {
每日一练社区's avatar
每日一练社区 已提交
179 180
        const char *str = s.c_str();
        for (int i = 0; i <= 7; i++)
每日一练社区's avatar
每日一练社区 已提交
181
        {
每日一练社区's avatar
每日一练社区 已提交
182 183 184 185 186 187 188

            int inta = parse(str, 0, i);

            if (inta >= N)
                break;
            for (int j = 1; j <= 9 - 1 - i; j++)

每日一练社区's avatar
每日一练社区 已提交
189 190
            {

每日一练社区's avatar
每日一练社区 已提交
191 192 193
                int intb = parse(str, i, j);
                int intc = parse(str, i + j, 9 - i - j);
                if (intb % intc == 0 && inta + intb / intc == N)
每日一练社区's avatar
每日一练社区 已提交
194
                {
每日一练社区's avatar
每日一练社区 已提交
195
                    ans++;
每日一练社区's avatar
每日一练社区 已提交
196 197 198
                }
            }
        }
每日一练社区's avatar
每日一练社区 已提交
199
    } while (next_permutation(s.begin(), s.end()));
每日一练社区's avatar
每日一练社区 已提交
200

每日一练社区's avatar
每日一练社区 已提交
201 202
    cout << ans;
    return 0;
每日一练社区's avatar
每日一练社区 已提交
203 204 205 206
}
```

### C
F
fix bug  
feilong 已提交
207

每日一练社区's avatar
每日一练社区 已提交
208
```cpp
每日一练社区's avatar
每日一练社区 已提交
209 210
int a[10] = {0};
int Division(int m)
每日一练社区's avatar
每日一练社区 已提交
211
{
每日一练社区's avatar
每日一练社区 已提交
212 213
    int t;
    while (m)
每日一练社区's avatar
每日一练社区 已提交
214
    {
每日一练社区's avatar
每日一练社区 已提交
215 216
        t = m % 10;
        if (t == 0)
每日一练社区's avatar
每日一练社区 已提交
217
        {
每日一练社区's avatar
每日一练社区 已提交
218
            return 0;
每日一练社区's avatar
每日一练社区 已提交
219
        }
每日一练社区's avatar
每日一练社区 已提交
220 221
        a[t]++;
        m = m / 10;
每日一练社区's avatar
每日一练社区 已提交
222
    }
每日一练社区's avatar
每日一练社区 已提交
223 224 225 226 227 228 229 230
    return 1;
}
int main()
{
    int i, k, j;
    int number, ans = 0, flag;
    cin >> number;
    for (i = 1; i < number; i++)
每日一练社区's avatar
每日一练社区 已提交
231
    {
每日一练社区's avatar
每日一练社区 已提交
232
        for (j = 1; j <= 4938; j++)
每日一练社区's avatar
每日一练社区 已提交
233
        {
每日一练社区's avatar
每日一练社区 已提交
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
            memset(a, 0, sizeof(a));
            k = (number - i) * j;
            if (Division(i) && Division(j) && Division(k))
            {
                flag = 1;
                for (int x = 1; x < 10; x++)
                {
                    if (a[x] != 1)
                    {
                        flag = 0;
                        break;
                    }
                }
                if (flag == 1)
                    ans++;
            }
每日一练社区's avatar
每日一练社区 已提交
250 251
        }
    }
每日一练社区's avatar
每日一练社区 已提交
252 253
    cout << ans;
    return 0;
每日一练社区's avatar
每日一练社区 已提交
254 255
}
```