提交 8dceb2d8 编写于 作者: 每日一练社区's avatar 每日一练社区

update exercises

上级 a8113757
/*
Name: 蓝桥杯:带分数(全排列)
Copyright: 本算法由KeepThinking_提供
Author: Jopus
Date: 08/02/14 19:57
Description: dev-cpp 5.5.3
*/
#include <stdio.h> #include <stdio.h>
/*思路:将list[1,2,3,4,5,6,7,8,9]数组进行全排列,然后对于每一种排列进行处理
处理方法:将list数组划分为三部分a,b,c,判断是否满足number == a+b/c && b%c == 0;
具体见分析.........
*/
int x = 0, number = 0, count = 0; int x = 0, number = 0, count = 0;
//交换a,b两数
void Swap(int &a, int &b) void Swap(int &a, int &b)
{ {
int temp = a; int temp = a;
a = b; a = b;
b = temp; b = temp;
} }
//将数组区间转化为数字
int getNum(int list[], int f, int r) int getNum(int list[], int f, int r)
{ {
int i = 0, num = 0; int i = 0, num = 0;
for (i = f; i <= r; i++) for (i = f; i <= r; i++)
num = list[i] + num * 10; //进位 num = list[i] + num * 10;
return num; return num;
} }
//进行全排列并对每种排列结果进行处理
void Prim(int list[], int k, int m) void Prim(int list[], int k, int m)
{ {
if (k == m - 1) //前缀是最后一个位置,此时出现一种排列数. if (k == m - 1)
{ {
int a = 0, b = 0, c = 0, bLast = 0; //带分数:a+b/c int a = 0, b = 0, c = 0, bLast = 0;
for (int i = 0; i < x; i++) //i表示a的末尾位置,不会超过number位数 for (int i = 0; i < x; i++)
{ {
a = getNum(list, 0, i); //将list数组中的[0-i]转化为数字,赋值给a a = getNum(list, 0, i);
bLast = ((number - a) * list[8]) % 10; //确定b最后一个数字 bLast = ((number - a) * list[8]) % 10;
for (int j = i + (8 - i) / 2; j < 8; j++) //从list数组中间位置开始找b末尾位置 for (int j = i + (8 - i) / 2; j < 8; j++)
{ {
if (list[j] == bLast) //找到b尾部 if (list[j] == bLast)
{ {
b = getNum(list, i + 1, j); //将list数组中的[i+1-j]转化为数字,赋值给b b = getNum(list, i + 1, j);
c = getNum(list, j + 1, 8); //将list数组中的[j+1-8]转化为数字,赋值给c c = getNum(list, j + 1, 8);
if (b % c == 0 && a + b / c == number) //判断合理性 if (b % c == 0 && a + b / c == number)
{ {
// printf("%d+%d/%d\n",a,b,c); //打印每种情况
++count; ++count;
} }
break; break;
...@@ -55,29 +44,29 @@ void Prim(int list[], int k, int m) ...@@ -55,29 +44,29 @@ void Prim(int list[], int k, int m)
} }
else else
{ {
for (int i = k; i < m; i++) //全排列数组list[] for (int i = k; i < m; i++)
{ {
//交换前缀,使之产生下一个前缀.
Swap(list[k], list[i]); //>>A Swap(list[k], list[i]);
Prim(list, k + 1, m); //>>B Prim(list, k + 1, m);
//将前缀换回来,继续做上一个的前缀排列.//>>C
Swap(list[k], list[i]); Swap(list[k], list[i]);
} }
} }
} }
//主函数
int main() int main()
{ {
int temp = 0; int temp = 0;
int list[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //定义全排列数组 int list[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
scanf("%d", &number); scanf("%d", &number);
temp = number; temp = number;
while (temp != 0) //统计number总共多少位 while (temp != 0)
{ {
++x; ++x;
temp /= 10; temp /= 10;
} }
Prim(list, 0, 9); Prim(list, 0, 9);
printf("%d", count); //打印总共多少种 printf("%d", count);
return 0; return 0;
} }
\ No newline at end of file
...@@ -36,30 +36,199 @@ ...@@ -36,30 +36,199 @@
## aop ## aop
### before ### before
```cpp ```cpp
#include <stdio.h>
int x = 0, number = 0, count = 0;
void Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int getNum(int list[], int f, int r)
{
int i = 0, num = 0;
for (i = f; i <= r; i++)
num = list[i] + num * 10;
return num;
}
``` ```
### after ### after
```cpp ```cpp
int main()
{
int temp = 0;
int list[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
scanf("%d", &number);
temp = number;
while (temp != 0)
{
++x;
temp /= 10;
}
Prim(list, 0, 9);
printf("%d", count);
return 0;
}
``` ```
## 答案 ## 答案
```cpp ```cpp
void Prim(int list[], int k, int m)
{
if (k == m - 1)
{
int a = 0, b = 0, c = 0, bLast = 0;
for (int i = 0; i < x; i++)
{
a = getNum(list, 0, i);
bLast = ((number - a) * list[8]) % 10;
for (int j = i + (8 - i) / 2; j < 8; j++)
{
if (list[j] == bLast)
{
b = getNum(list, i + 1, j);
c = getNum(list, j + 1, 8);
if (b % c == 0 && a + b / c == number)
{
++count;
}
break;
}
}
}
}
else
{
for (int i = k; i < m; i++)
{
Swap(list[k], list[i]);
Prim(list, k + 1, m);
Swap(list[k], list[i]);
}
}
}
``` ```
## 选项 ## 选项
### A ### A
```cpp ```cpp
void Prim(int list[], int k, int m)
{
if (k == m - 1)
{
int a = 0, b = 0, c = 0, bLast = 0;
for (int i = 0; i < x; i++)
{
a = getNum(list, 0, i);
bLast = ((number - a) * list[8]) % 10;
for (int j = i + (8 - i) / 2; j < 8; j++)
{
if (list[j] == bLast)
{
b = getNum(list, i, j);
c = getNum(list, j, 8);
if (b % c == 0 && a + b / c == number)
{
++count;
}
break;
}
}
}
}
else
{
for (int i = k; i < m; i++)
{
Swap(list[k], list[i]);
Prim(list, k + 1, m);
Swap(list[k], list[i]);
}
}
}
``` ```
### B ### B
```cpp ```cpp
void Prim(int list[], int k, int m)
{
if (k == m - 1)
{
int a = 0, b = 0, c = 0, bLast = 0;
for (int i = 0; i < x; i++)
{
a = getNum(list, 0, i);
bLast = ((number - a) * list[8]) % 10;
for (int j = i + (8 - i) / 2; j < 8; j++)
{
b = getNum(list, i, j);
c = getNum(list, j, 8);
if (b % c == 0 && a + b / c == number)
{
++count;
}
break;
}
}
}
else
{
for (int i = k; i < m; i++)
{
Swap(list[k], list[i]);
Prim(list, k + 1, m);
Swap(list[k], list[i]);
}
}
}
``` ```
### C ### C
```cpp ```cpp
void Prim(int list[], int k, int m)
{
if (k == m - 1)
{
int a = 0, b = 0, c = 0, bLast = 0;
for (int i = 0; i < x; i++)
{
a = getNum(list, 0, i);
bLast = ((number - a) * list[8]) % 10;
for (int j = i + (8 - i) / 2; j < 8; j++)
{
if (list[j] == bLast)
{
b = getNum(list, i + 1, j);
c = getNum(list, j + 1, 8);
++count;
break;
}
}
}
}
else
{
for (int i = k; i < m; i++)
{
Swap(list[k], list[i]);
Prim(list, k + 1, m);
Swap(list[k], list[i]);
}
}
}
``` ```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册