回答編集履歴

5

誤字修正

2021/11/24 07:09

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
  使うことを考えてみましょう。
106
106
 
107
- 和は降順、数値は昇順ですから、和を符号反転すると、比較関数が簡単になります。
107
+ 和は降順、数値は昇順ですから、和を符号反転すると、比較関数が簡単になります。
108
108
 
109
109
  ```C
110
110
 

4

誤字の修正

2021/11/24 07:09

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -104,7 +104,7 @@
104
104
 
105
105
  使うことを考えてみましょう。
106
106
 
107
- 和は降順、数値は昇順ですから、和は負号反転すると、比較関数が簡単になります。
107
+ 和は降順、数値は昇順ですから、和を符反転すると、比較関数が簡単になります。
108
108
 
109
109
  ```C
110
110
 

3

コードの修正

2021/11/24 04:35

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -118,7 +118,9 @@
118
118
 
119
119
  {
120
120
 
121
- return *(long long*)n1 - *(long long*)n2;
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

追記

2021/11/24 04:16

投稿

kazuma-s
kazuma-s

スコア8224

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

コードの修正

2021/11/24 04:07

投稿

kazuma-s
kazuma-s

スコア8224

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 -1;
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