回答編集履歴

4

printf の解を追記

2021/08/02 06:44

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -39,3 +39,45 @@
39
39
  }
40
40
 
41
41
  ```
42
+
43
+ **追記**
44
+
45
+ ++m を (n + i) に変えると、変数 m が要らなくなります。
46
+
47
+
48
+
49
+ 1行を printf 1つで出力することもできます。
50
+
51
+ ```C
52
+
53
+ #include <stdio.h> // scanf, printf
54
+
55
+ #include <stdlib.h> // abs, malloc
56
+
57
+ #include <string.h> // memset
58
+
59
+
60
+
61
+ int main(void)
62
+
63
+ {
64
+
65
+ int n;
66
+
67
+ scanf("%d", &n);
68
+
69
+ char *p = malloc(n * 2);
70
+
71
+ for (int i = -n; ++i < n; ) {
72
+
73
+ int j = abs(i), k = (n - j) * 2 - 1;
74
+
75
+ memset(p, (n + i) % 10 + '0', k);
76
+
77
+ printf("%*.*s\n", j + k, k, p);
78
+
79
+ }
80
+
81
+ }
82
+
83
+ ```

3

コメントの修正

2021/08/02 06:44

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  ```C
14
14
 
15
- #include <stdio.h> // putchar
15
+ #include <stdio.h> // scanf, putchar
16
16
 
17
17
  #include <stdlib.h> // abs
18
18
 

2

修正

2021/08/01 23:34

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  for (int i = -n; ++i < n; putchar('\n')) {
30
30
 
31
- int j = abs(i), k = (n - j) * 2; c = ++m % 10 + '0';
31
+ int j = abs(i), k = (n - j) * 2, c = ++m % 10 + '0';
32
32
 
33
33
  while (j--) putchar(' ');
34
34
 

1

別解

2021/08/01 23:25

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -1,3 +1,7 @@
1
+ 解決済みなので別解を示します。
2
+
3
+
4
+
1
5
  n が 4 のとき、空白の個数 j は 3, 2, 1, 0, 1, 2, 3 と変化します。
2
6
 
3
7
  これは -3, -2, -1, 0, 1, 2, 3 と変化する i の絶対値 abs(i) です。