回答編集履歴
5
誤字修正
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
使うことを考えてみましょう。
|
106
106
|
|
107
|
-
和は降順、数値は昇順ですから、和を符号
|
107
|
+
和は降順、数値は昇順ですから、和を符号反転すると、比較関数が簡単になります。
|
108
108
|
|
109
109
|
```C
|
110
110
|
|
4
誤字の修正
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
使うことを考えてみましょう。
|
106
106
|
|
107
|
-
和は降順、数値は昇順ですから、和
|
107
|
+
和は降順、数値は昇順ですから、和を符号号反転すると、比較関数が簡単になります。
|
108
108
|
|
109
109
|
```C
|
110
110
|
|
3
コードの修正
test
CHANGED
@@ -118,7 +118,9 @@
|
|
118
118
|
|
119
119
|
{
|
120
120
|
|
121
|
-
|
121
|
+
long long a = *(long long *)n1, b = *(long long *)n2;
|
122
|
+
|
123
|
+
return a < b ? -1 : a > b;
|
122
124
|
|
123
125
|
}
|
124
126
|
|
2
追記
test
CHANGED
@@ -95,3 +95,67 @@
|
|
95
95
|
```
|
96
96
|
|
97
97
|
このコードは理解できますか?
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
**追記**
|
102
|
+
|
103
|
+
2つの値(32ビットint)をひとつにまとめるのに、long long(64ビット) を
|
104
|
+
|
105
|
+
使うことを考えてみましょう。
|
106
|
+
|
107
|
+
和は降順、数値は昇順ですから、和は負号反転すると、比較関数が簡単になります。
|
108
|
+
|
109
|
+
```C
|
110
|
+
|
111
|
+
#include <stdio.h> // scanf, printf
|
112
|
+
|
113
|
+
#include <stdlib.h> // qsort
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
int cmpnum(const void *n1, const void *n2)
|
118
|
+
|
119
|
+
{
|
120
|
+
|
121
|
+
return *(long long*)n1 - *(long long*)n2;
|
122
|
+
|
123
|
+
}
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
int main(void)
|
128
|
+
|
129
|
+
{
|
130
|
+
|
131
|
+
int num, N;
|
132
|
+
|
133
|
+
long long arr[100];
|
134
|
+
|
135
|
+
scanf("%d", &N);
|
136
|
+
|
137
|
+
for (int i = 0; i < N; ++i) {
|
138
|
+
|
139
|
+
scanf("%d", &num);
|
140
|
+
|
141
|
+
long long sum = 0;
|
142
|
+
|
143
|
+
for (int n = num; n; n /= 10) sum += n % 10;
|
144
|
+
|
145
|
+
arr[i] = -sum << 32 | num; // 和は降順、数は昇順
|
146
|
+
|
147
|
+
}
|
148
|
+
|
149
|
+
qsort(arr, N, sizeof(arr[0]), cmpnum);
|
150
|
+
|
151
|
+
for (int i = 0; i < N; i++)
|
152
|
+
|
153
|
+
printf("%lld ", arr[i] & 0xffffffff);
|
154
|
+
|
155
|
+
printf("\n");
|
156
|
+
|
157
|
+
return 0;
|
158
|
+
|
159
|
+
}
|
160
|
+
|
161
|
+
```
|
1
コードの修正
test
CHANGED
@@ -40,9 +40,9 @@
|
|
40
40
|
|
41
41
|
int *a = (int*)n1, *b = (int*)n2;
|
42
42
|
|
43
|
-
if (a[0] < b[0]) return
|
43
|
+
if (a[0] < b[0]) return 1;
|
44
44
|
|
45
|
-
if (a[0] > b[0]) return 1;
|
45
|
+
if (a[0] > b[0]) return -1;
|
46
46
|
|
47
47
|
if (a[1] < b[1]) return -1;
|
48
48
|
|