与过河卒同为卡我半个月的恶俗题,,,今日(指11.19)双双解决,双喜临门,但代码还是较复杂恶心,以后训练有素了再改,,,
- 错误想法:全部数字乘10到同一数量级,再逐位比:
#include<stdio.h>
int main()
{
long long a[20], mut[20], sign[20], n, outtime = 0;
scanf("%lld", &n);
for (int i = 0; i < n; i++)
{
scanf("%lld", &a[i]);
mut[i] = 1;
sign[i] = 0;
while (a[i] < 1e9 && a[i] != 0)
{
a[i] *= 10;
mut[i] *= 10;
}
//printf("%lld\n", a[i]);
}
while (outtime < n)
for (int i = 0; i < n; i++)
{
if (sign[i] == 1)
continue;
for (long long i2 = 0; i2 < n; i2++)
{
if (a[i] < a[i2] && sign[i2] == 0)
break;
if (i2 + 1 == n - outtime)
{
//printf("%lld\n", a[i]);
printf("%lld", a[i] / mut[i]);
sign[i] = 1;
outtime++;
}
}
}
return 0;
}
然后就错了,,,
原因是没有考虑到如321、32这类数,32321>32132,但按原来做法最后1>0,先输出321。
- 正确做法:
字符型数组存数字,每个数字输入完后做标记(如‘a’),当比至短数字最后一位时仍相同、识别到a后,用第一位与长数字末位比。
#include <stdio.h>
char num[20][11];
int main()
{
int n, p = 0, ord = 0, max;
char maxp, ip, in;
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int i2 = 0; i2 < 11; i2++)
num[i][i2] = '\0';
while (scanf("%c", &in) != EOF)
if (in == ' ')
{
num[ord][p] = 'a';
p = 0;
ord++;
}
else if (in >= '0' && in <= '9')
num[ord][p++] = in;
num[ord][p] = 'a';
for (int i = 0; i < n; i++)
//printf("%s\n", num[i]);
for (int time = 0; time < n; time++)
{
max = 0;
while (num[max][0] == '-')
max++;
for (int i = max + 1; i < n; i++)
{
if (num[i][0] == '-')
{
//printf("- : %d\n", i);
continue;
}
else
{
for (int p = 0; p < 11; p++)
{
//printf("max=%d, i=%d\n", max, i);
maxp = num[max][p];
ip = num[i][p];
if (num[max][p] == 'a')
maxp = num[max][0];
if (num[i][p] == 'a')
ip = num[i][0];
//printf("maxp=%c, ip=%c\n", maxp, ip);
if (maxp > ip)
break;
else if (maxp < ip)
{
max = i;
break;
}
}
}
}
p = 0;
//printf("output : %d:\n", max);
while (num[max][p] >= '0' && num[max][p] <= '9')
printf("%c", num[max][p++]);
//puts("");
num[max][0] = '-';
}
return 0;
}