|
【試題】帶分數 |
一派掌門 二十級 |
#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函數的速度快。
|
|