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

回答編集履歴

4

printf の解を追記

2021/08/02 06:44

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -18,4 +18,25 @@
18
18
  while (--k) putchar(c);
19
19
  }
20
20
  }
21
+ ```
22
+ **追記**
23
+ ++m を (n + i) に変えると、変数 m が要らなくなります。
24
+
25
+ 1行を printf 1つで出力することもできます。
26
+ ```C
27
+ #include <stdio.h> // scanf, printf
28
+ #include <stdlib.h> // abs, malloc
29
+ #include <string.h> // memset
30
+
31
+ int main(void)
32
+ {
33
+ int n;
34
+ scanf("%d", &n);
35
+ char *p = malloc(n * 2);
36
+ for (int i = -n; ++i < n; ) {
37
+ int j = abs(i), k = (n - j) * 2 - 1;
38
+ memset(p, (n + i) % 10 + '0', k);
39
+ printf("%*.*s\n", j + k, k, p);
40
+ }
41
+ }
21
42
  ```

3

コメントの修正

2021/08/02 06:44

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  表示する数字の個数は (n - j) * 2 - 1 です。
6
6
 
7
7
  ```C
8
- #include <stdio.h> // putchar
8
+ #include <stdio.h> // scanf, putchar
9
9
  #include <stdlib.h> // abs
10
10
 
11
11
  int main(void)

2

修正

2021/08/01 23:34

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  int n, m = 0;
14
14
  scanf("%d", &n);
15
15
  for (int i = -n; ++i < n; putchar('\n')) {
16
- int j = abs(i), k = (n - j) * 2; c = ++m % 10 + '0';
16
+ int j = abs(i), k = (n - j) * 2, c = ++m % 10 + '0';
17
17
  while (j--) putchar(' ');
18
18
  while (--k) putchar(c);
19
19
  }

1

別解

2021/08/01 23:25

投稿

kazuma-s
kazuma-s

スコア8222

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