teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

誤字修正

2021/11/24 07:09

投稿

kazuma-s
kazuma-s

スコア8222

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

誤字の修正

2021/11/24 07:09

投稿

kazuma-s
kazuma-s

スコア8222

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

コードの修正

2021/11/24 04:35

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -58,7 +58,8 @@
58
58
 
59
59
  int cmpnum(const void *n1, const void *n2)
60
60
  {
61
- return *(long long*)n1 - *(long long*)n2;
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

追記

2021/11/24 04:16

投稿

kazuma-s
kazuma-s

スコア8222

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

コードの修正

2021/11/24 04:07

投稿

kazuma-s
kazuma-s

スコア8222

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] < b[0]) return -1;
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;