问题 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
仅供参考!谢谢!
#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;
}