c语言 直接调用自定义函数

问题 J: 高精度减法之排序减法

时间限制: 1.000 Sec 内存限制: 128 MB
提交: 151 解决: 62
[命题人:][下载数据: ?]
题目描述
有两个纯粹由数字组成的字符串s1,s2,将s1串中的数字进行从大到小排列,s2串中的数字从小到大排列,求排列后s1-s2的值(s1转换为数字时大于0)
输入
输入2行数字字符串数据,分别代表s1,s2;
如:
213
21
(排列后 s1的值是321 ; s2的值是12 ;)
输出
s1-s2的值
如:
309
(根据上面输入的示例,计算结果为321-12=309)
样例
输入 复制
213
21
输出 复制
309

仅供参考!谢谢!

img


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SWAP(x,y) char tmp;tmp=x;x=y;y=tmp

// 字符串递增排序
char *sort_asc(char *s)
{
    if (!s)
        return NULL;
    char *p = s;
    int i = 0, j;
    size_t len = strlen(s);
    for (; i < len - 1; i++)
    {
        for (j = i + 1; j < len; j++)
        {
            if (*(p + i) > *(p + j))
            {
                SWAP(*(p + i), *(p + j));
            }
        }

    }
    *(p + j) = '\0';
    return p;
}

// 字符串递减排序
char *sort_inde(char *s)
{
    if (!s)
        return NULL;
    char *p = s;
    int i = 0, j;
    size_t len = strlen(s);
    for (; i < len - 1; i++)
    {
        for (j = i + 1 ; j < len; j++)
        {
            if (*(p + i) < *(p + j))
            {
                SWAP(*(p + i), *(p + j));
            }
        }

    }
    *(p + j) = '\0';
    return p;
}

int main()
{
    char s1[1000], s2[1000];
    // 
    long res;
    puts("输入字符串s1:");
    scanf("%999s", s1);
    puts("输入字符串s2:");
    scanf("%999s", s2);
    res = atol(sort_inde(s1)) - atol(sort_asc(s2));
    printf("%s-%s=%ld\n", s1, s2, res);

    return 0;
}