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
```
每日一练社区's avatar
每日一练社区 已提交
28

29
**样例输出1**
F
fix bug  
feilong 已提交
30

每日一练社区's avatar
每日一练社区 已提交
31 32 33
```
11
```
每日一练社区's avatar
每日一练社区 已提交
34

35
**样例输入2**
F
fix bug  
feilong 已提交
36

每日一练社区's avatar
每日一练社区 已提交
37 38 39
```
105
```
每日一练社区's avatar
每日一练社区 已提交
40

41
**样例输出2**
F
fix bug  
feilong 已提交
42

每日一练社区's avatar
每日一练社区 已提交
43 44 45 46
```
6
```

每日一练社区's avatar
每日一练社区 已提交
47
以下<span style="color:red">错误</span>的一项是?
每日一练社区's avatar
每日一练社区 已提交
48

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

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

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

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

每日一练社区's avatar
每日一练社区 已提交
59
### after
F
fix bug  
feilong 已提交
60

每日一练社区's avatar
每日一练社区 已提交
61
```cpp
每日一练社区's avatar
每日一练社区 已提交
62

每日一练社区's avatar
每日一练社区 已提交
63 64 65
```

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

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

每日一练社区's avatar
每日一练社区 已提交
82 83 84 85 86 87 88 89
            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
每日一练社区 已提交
90 91
            }
        }
每日一练社区's avatar
每日一练社区 已提交
92 93 94
    } while (next_permutation(s.begin(), s.end()));
    printf("%d\n", ans);
    return 0;
每日一练社区's avatar
每日一练社区 已提交
95 96 97 98
}
```
## 选项

F
fix bug  
feilong 已提交
99

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

每日一练社区's avatar
每日一练社区 已提交
102
```cpp
每日一练社区's avatar
每日一练社区 已提交
103 104 105 106 107
int visit[10] = {0};
int s[10];
int ans = 0;
int N;
void found(int s[])
每日一练社区's avatar
每日一练社区 已提交
108
{
每日一练社区's avatar
每日一练社区 已提交
109 110
    int x, y, z;
    for (int i = 1; i < 9; i++)
每日一练社区's avatar
每日一练社区 已提交
111
    {
每日一练社区's avatar
每日一练社区 已提交
112
        for (int j = i + 1; j < 9; j++)
每日一练社区's avatar
每日一练社区 已提交
113
        {
每日一练社区's avatar
每日一练社区 已提交
114 115
            x = y = z = 0;
            for (int k = 0; k < 9; k++)
每日一练社区's avatar
每日一练社区 已提交
116
            {
每日一练社区's avatar
每日一练社区 已提交
117 118 119 120 121 122 123 124 125 126
                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
每日一练社区 已提交
127 128 129
            }
        }
    }
每日一练社区's avatar
每日一练社区 已提交
130 131 132 133 134 135
}

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

每日一练社区's avatar
每日一练社区 已提交
158 159 160
```

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

每日一练社区's avatar
每日一练社区 已提交
162
```cpp
每日一练社区's avatar
每日一练社区 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175
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
每日一练社区 已提交
176
{
每日一练社区's avatar
每日一练社区 已提交
177 178 179 180 181
    int N;
    cin >> N;
    int ans = 0;
    string s = "123456789";
    do
每日一练社区's avatar
每日一练社区 已提交
182
    {
每日一练社区's avatar
每日一练社区 已提交
183 184
        const char *str = s.c_str();
        for (int i = 0; i <= 7; i++)
每日一练社区's avatar
每日一练社区 已提交
185
        {
每日一练社区's avatar
每日一练社区 已提交
186 187 188 189 190 191 192

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

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

每日一练社区's avatar
每日一练社区 已提交
193 194
            {

每日一练社区's avatar
每日一练社区 已提交
195 196 197
                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
每日一练社区 已提交
198
                {
每日一练社区's avatar
每日一练社区 已提交
199
                    ans++;
每日一练社区's avatar
每日一练社区 已提交
200 201 202
                }
            }
        }
每日一练社区's avatar
每日一练社区 已提交
203
    } while (next_permutation(s.begin(), s.end()));
每日一练社区's avatar
每日一练社区 已提交
204

每日一练社区's avatar
每日一练社区 已提交
205 206
    cout << ans;
    return 0;
每日一练社区's avatar
每日一练社区 已提交
207 208 209 210
}
```

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

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