|
【试题】带分数 |
一派護法 十九級 |
#include <stdio.h> #include <string.h>
int number, count = 0;
int getn(char *str, int n) { int i, r = 0; for (i = 0; i < n; i++) { r *= 10; r += str[i] - '0'; } return r; }
void cb(char arr[], int n) { int p, d; int a, b, c; for (p = 0; p < n - 1; p++) // 加号的位置 { for (d = p + 1; d < n - 1; d++) // 除号的位置 { b = getn(arr + p, d - p); c = getn(arr + d, n - d); if (b % c == 0) { a = getn(arr, p); if (a + b / c == number) { //printf("%d = %d + %d / %d\n", number, a, b, c); count++; } } } } }
void swap(char *a, char *b) { char t = *a; *a = *b; *b = t; }
// 以下为全排列算法 void fun(char arr[], int n, int k) { int i; if (k >= n) { /*for (i = 0; i < n; i++) printf("%d ", arr[i]); putchar('\n');*/ cb(arr, n); // 调用回调函数 return; } for (i = k; i < n; i++) { swap(arr + i, arr + k); fun(arr, n, k + 1); swap(arr + i, arr + k); } }
int main() { char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; scanf("%d", &number); fun(arr, 9, 0); printf("%d\n", count); return 0; }
|
一派護法 十九級 |
详细记录
评测点序号评测结果得分CPU使用内存使用下载评测数据
1 错误 0.00 187ms 1.601MB 输入 输出
2 正确 33.33 187ms 1.601MB VIP特权
3 正确 33.33 202ms 1.601MB VIP特权
当输入为2013时结果错误。
得分只有66分。。。
|
一派護法 十九級 |
2013 2013 = 14 + 75962 / 38 2013 = 5 + 184736 / 92 2013 = 56 + 27398 / 14 2013 = 75 + 81396 / 42 4
-------------------------------- Process exited after 1.52 seconds with return value 0 Press any key to continue . . .
|
一派護法 十九級 |
还有一种情况: 2013 2013=5+184736/92 2013=14+75962/38 2013=56+27398/14 2013=75+81396/42 2013=1287+6534/9
|
一派護法 十九級 |
【错误原因】 加号位置的范围是1~n-1(n=9) 所以应该for (p = 1; p < n; p++) p=0: +012345678 (错误) p=1: 0+12345678 p=2: 01+2345678 p=3: 012+345678 p=4: 0123+45678 p=5: 01234+5678 p=6: 012345+678 p=7: 0123456+78 p=8: 01234567+8
|
一派護法 十九級 |
提交时间 03-13 18:09
评测结果 正确
得分 100
CPU使用 171ms
内存使用 1.601MB 【代码】 #include <stdio.h> #include <string.h>
int number, count = 0;
int getn(char *str, int n) { int i, r = 0; for (i = 0; i < n; i++) { r *= 10; r += str[i] - '0'; } return r; }
void cb(char arr[], int n) { int p, d; int a, b, c; for (p = 1; p < n; p++) // 加号的位置 { for (d = p + 1; d < n; d++) // 除号的位置 { b = getn(arr + p, d - p); c = getn(arr + d, n - d); if (b % c == 0) { a = getn(arr, p); if (a + b / c == number) { //printf("%d = %d + %d / %d\n", number, a, b, c); count++; } } } } }
void swap(char *a, char *b) { char t = *a; *a = *b; *b = t; }
// 以下为全排列算法 void fun(char arr[], int n, int k) { int i; if (k >= n) { /*for (i = 0; i < n; i++) printf("%d ", arr[i]); putchar('\n');*/ cb(arr, n); // 调用回调函数 return; } for (i = k; i < n; i++) { swap(arr + i, arr + k); fun(arr, n, k + 1); swap(arr + i, arr + k); } }
int main() { char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; scanf("%d", &number); fun(arr, 9, 0); printf("%d\n", count); return 0; }
|
一派護法 十九級 |
memcpy后再atoi的速度太慢,不如getn函数的速度快。
|