POj-2718 Smallest Difference--全排列next_permutation()的应用文章标题

来源:互联网 发布:java log4j stdout 编辑:程序博客网 时间:2024/05/22 15:30

next_permutation(s.begin(),s.end())列出下一个较大的组合
prev_permutation(s.begin(),s.end())列出上一个较小的组合

#include<stdio.h>#include<algorithm>#include<cmath>using namespace std;int main() {    char the_char_string[100];    int the_digit_string[13];    int the_num;    scanf("%d", &the_num);    getchar();    while (the_num--) {        gets_s(the_char_string);        int len = 0;        int min_abs = 100000000;        for (int i = 0; i<strlen(the_char_string); i++) {            if ('0'<=the_char_string[i]&&the_char_string[i]<='9') {                the_digit_string[len++] = the_char_string[i] - '0';            }        }        sort(the_digit_string, the_digit_string + len);        do {            if (the_digit_string[0] == 0) {                continue;            }            else if (the_digit_string[len / 2] == 0&&len>2) {                //处理前面的数字多一个的情况,此时后面的数字串不能以0开头                int num1 = 0, num2 = 0;                for (int i = 0; i < len / 2 + 1; i++)                    num1 = num1 * 10 + the_digit_string[i];                for (int i = len / 2 + 1; i < len; i++)                    num2 = num2 * 10 + the_digit_string[i];                min_abs = min(min_abs, abs(num1 - num2));            }            else {                //处理后面与前面一样或后面的比前面多一个的情况                int num1 = 0, num2 = 0;                for (int i = 0; i < len / 2; i++)                    num1 = num1 * 10 + the_digit_string[i];                for (int i = len / 2; i < len; i++)                    num2 = num2 * 10 + the_digit_string[i];                min_abs = min(min_abs, abs(num1 - num2));            }        } while (next_permutation(the_digit_string, the_digit_string + len));        printf("%d\n", min_abs);    }    return 0;}

O(∩_∩)O谢谢阅读!!!