回答編集履歴
5
誤字修正
answer
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|
**追記**
|
52
52
|
2つの値(32ビットint)をひとつにまとめるのに、long long(64ビット) を
|
53
53
|
使うことを考えてみましょう。
|
54
|
-
和は降順、数値は昇順ですから、和を符号
|
54
|
+
和は降順、数値は昇順ですから、和を符号反転すると、比較関数が簡単になります。
|
55
55
|
```C
|
56
56
|
#include <stdio.h> // scanf, printf
|
57
57
|
#include <stdlib.h> // qsort
|
4
誤字の修正
answer
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|
**追記**
|
52
52
|
2つの値(32ビットint)をひとつにまとめるのに、long long(64ビット) を
|
53
53
|
使うことを考えてみましょう。
|
54
|
-
和は降順、数値は昇順ですから、和
|
54
|
+
和は降順、数値は昇順ですから、和を符号号反転すると、比較関数が簡単になります。
|
55
55
|
```C
|
56
56
|
#include <stdio.h> // scanf, printf
|
57
57
|
#include <stdlib.h> // qsort
|
3
コードの修正
answer
CHANGED
@@ -58,7 +58,8 @@
|
|
58
58
|
|
59
59
|
int cmpnum(const void *n1, const void *n2)
|
60
60
|
{
|
61
|
-
|
61
|
+
long long a = *(long long *)n1, b = *(long long *)n2;
|
62
|
+
return a < b ? -1 : a > b;
|
62
63
|
}
|
63
64
|
|
64
65
|
int main(void)
|
2
追記
answer
CHANGED
@@ -46,4 +46,36 @@
|
|
46
46
|
return 0;
|
47
47
|
}
|
48
48
|
```
|
49
|
-
このコードは理解できますか?
|
49
|
+
このコードは理解できますか?
|
50
|
+
|
51
|
+
**追記**
|
52
|
+
2つの値(32ビットint)をひとつにまとめるのに、long long(64ビット) を
|
53
|
+
使うことを考えてみましょう。
|
54
|
+
和は降順、数値は昇順ですから、和は負号反転すると、比較関数が簡単になります。
|
55
|
+
```C
|
56
|
+
#include <stdio.h> // scanf, printf
|
57
|
+
#include <stdlib.h> // qsort
|
58
|
+
|
59
|
+
int cmpnum(const void *n1, const void *n2)
|
60
|
+
{
|
61
|
+
return *(long long*)n1 - *(long long*)n2;
|
62
|
+
}
|
63
|
+
|
64
|
+
int main(void)
|
65
|
+
{
|
66
|
+
int num, N;
|
67
|
+
long long arr[100];
|
68
|
+
scanf("%d", &N);
|
69
|
+
for (int i = 0; i < N; ++i) {
|
70
|
+
scanf("%d", &num);
|
71
|
+
long long sum = 0;
|
72
|
+
for (int n = num; n; n /= 10) sum += n % 10;
|
73
|
+
arr[i] = -sum << 32 | num; // 和は降順、数は昇順
|
74
|
+
}
|
75
|
+
qsort(arr, N, sizeof(arr[0]), cmpnum);
|
76
|
+
for (int i = 0; i < N; i++)
|
77
|
+
printf("%lld ", arr[i] & 0xffffffff);
|
78
|
+
printf("\n");
|
79
|
+
return 0;
|
80
|
+
}
|
81
|
+
```
|
1
コードの修正
answer
CHANGED
@@ -19,8 +19,8 @@
|
|
19
19
|
int cmpnum(const void *n1, const void *n2)
|
20
20
|
{
|
21
21
|
int *a = (int*)n1, *b = (int*)n2;
|
22
|
+
if (a[0] < b[0]) return 1;
|
22
|
-
if (a[0]
|
23
|
+
if (a[0] > b[0]) return -1;
|
23
|
-
if (a[0] > b[0]) return 1;
|
24
24
|
if (a[1] < b[1]) return -1;
|
25
25
|
if (a[1] > b[1]) return 1;
|
26
26
|
return 0;
|