|  | 
          1樓
          巨大八爪鱼
          2016-3-13 17:48
          
          
            #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;
 }
 | 
    
      |  | 
          2樓
          巨大八爪鱼
          2016-3-13 17:49
          
          
            详细记录
评测点序号评测结果得分CPU使用内存使用下载评测数据1  错误  0.00  187ms  1.601MB  输入 输出
 2  正确  33.33  187ms  1.601MB  VIP特权
 3  正确  33.33  202ms  1.601MB  VIP特权
 
 
 当输入为2013时结果错误。
 
 得分只有66分。。。
 
 | 
    
      |  | 
          3樓
          巨大八爪鱼
          2016-3-13 17:49
          
          
            20132013 = 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 . . .
 | 
    
      |  | 
          4樓
          巨大八爪鱼
          2016-3-13 17:53
          
          
            还有一种情况:2013
 2013=5+184736/92
 2013=14+75962/38
 2013=56+27398/14
 2013=75+81396/42
 2013=1287+6534/9
 
 | 
    
      |  | 
          6樓
          巨大八爪鱼
          2016-3-13 18:08
          
          
            【错误原因】加号位置的范围是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
 
 | 
    
      |  | 
          7樓
          巨大八爪鱼
          2016-3-13 18:08
          
          
            提交时间  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;
 }
 
 | 
    
      |  | 
          8樓
          巨大八爪鱼
          2016-3-13 18:09
          
          
            memcpy后再atoi的速度太慢,不如getn函数的速度快。
 |