diff --git "a/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.cpp" "b/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.cpp" index 2a1e7dd0cc202b46dcb42e0536d54f7c23249719..11d0fb656b5fb3a5ec2fdf18c381a1d84a29880c 100644 --- "a/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.cpp" +++ "b/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.cpp" @@ -1,51 +1,40 @@ -/* - Name: è“æ¡¥æ¯ï¼šå¸¦åˆ†æ•°ï¼ˆå…¨æŽ’列) - Copyright: 本算法由KeepThinking_æä¾› - Author: Jopus - Date: 08/02/14 19:57 - Description: dev-cpp 5.5.3 -*/ + #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; -//交æ¢a,b两数 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; //è¿›ä½ + num = list[i] + num * 10; return num; } -//进行全排列并对æ¯ç§æŽ’åˆ—ç»“æžœè¿›è¡Œå¤„ç† + 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 - for (int i = 0; i < x; i++) //i表示a的末尾ä½ç½®ï¼Œä¸ä¼šè¶…过numberä½æ•° + int a = 0, b = 0, c = 0, bLast = 0; + for (int i = 0; i < x; i++) { - a = getNum(list, 0, i); //å°†list数组ä¸çš„[0-i]转化为数å—,赋值给a - bLast = ((number - a) * list[8]) % 10; //确定b最åŽä¸€ä¸ªæ•°å— - for (int j = i + (8 - i) / 2; j < 8; j++) //从list数组ä¸é—´ä½ç½®å¼€å§‹æ‰¾b末尾ä½ç½® + 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尾部 + if (list[j] == bLast) { - b = getNum(list, i + 1, j); //å°†list数组ä¸çš„[i+1-j]转化为数å—,赋值给b - c = getNum(list, j + 1, 8); //å°†list数组ä¸çš„[j+1-8]转化为数å—,赋值给c - if (b % c == 0 && a + b / c == number) //判æ–åˆç†æ€§ + b = getNum(list, i + 1, j); + c = getNum(list, j + 1, 8); + if (b % c == 0 && a + b / c == number) { - // printf("%d+%d/%d\n",a,b,c); //打å°æ¯ç§æƒ…况 + ++count; } break; @@ -55,29 +44,29 @@ void Prim(int list[], int k, int m) } else { - for (int i = k; i < m; i++) //全排列数组list[] + for (int i = k; i < m; i++) { - //交æ¢å‰ç¼€,使之产生下一个å‰ç¼€. - Swap(list[k], list[i]); //>>A - Prim(list, k + 1, m); //>>B - //å°†å‰ç¼€æ¢å›žæ¥,继ç»åšä¸Šä¸€ä¸ªçš„å‰ç¼€æŽ’列.//>>C + + Swap(list[k], list[i]); + Prim(list, k + 1, m); + Swap(list[k], list[i]); } } } -//主函数 + int main() { 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); temp = number; - while (temp != 0) //统计numberæ€»å…±å¤šå°‘ä½ + while (temp != 0) { ++x; temp /= 10; } Prim(list, 0, 9); - printf("%d", count); //打å°æ€»å…±å¤šå°‘ç§ + printf("%d", count); return 0; } \ No newline at end of file diff --git "a/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.md" "b/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.md" index c7298112607819de57538e63d63141e6205ebf5d..433f759dd013c26ae6fd4cd5a5ecd93e5420abfd 100644 --- "a/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.md" +++ "b/data/1.\347\256\227\346\263\225\345\210\235\351\230\266/1.\350\223\235\346\241\245\346\235\257/\345\270\246\345\210\206\346\225\260/solution.md" @@ -36,30 +36,199 @@ ## aop ### before ```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 ```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 - +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 ```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 ```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 ```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]); + } + } +} ```