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

回答編集履歴

3

for文1個、条件分岐無しでかきなおし。

2022/11/25 10:53

投稿

matukeso
matukeso

スコア1685

answer CHANGED
@@ -1,22 +1,31 @@
1
- バケットソートをかければ、頻度計量分で反復1回、頻度用にchar[128]あたりをとって配列一個。
1
+ バケットソートをかければ、頻度計量分で反復1回、頻度用にint[80]あたりをとって配列一個。
2
- 頻度出力入出力処理なの、二重ループでもOK言い張る。
2
+ ループを多めに回すこで、頻度の計算と、結果の出力を一つのfor文にしてい。スペースa-z0x1fANDをとるときれいいに0~27にならぶ
3
- inputはgetcharwhileとかで回せば無くなるけど
3
+ if文で条件分岐できなくても条件式の結果が1/0に成ること利用した制御とか、ループ変数を書き換えるのは本来的には禁じ手とおもう。
4
+
4
5
  ```C
6
+ #include <stdio.h>
5
- char input[51], bin[128]=“”;
7
+ #include <string.h>
8
+ int main()
9
+ {
6
- const char *p;
10
+ char str[51];
11
+ int bin[80] = {0};
12
+ int len;
13
+ char *wp = str;
7
- int i;
14
+ int i;
8
15
  //input
9
- scanf(%50s, input);
16
+ scanf("%50s", str );
10
17
 
11
18
  //process
19
+ len = strlen( str );
12
- for(p=input; *p; p++)
20
+ for( i=0; i<len+27; i++){
13
- bin[ *p ]++;
14
- bin[‘-‘]=bin[‘ ‘];
21
+ bin[ (str[i%len]&0x1f)+len] += i<len;
15
- bin[‘ ‘]=0;
16
22
 
23
+ wp += sprintf(wp, "%*.*s", bin[i]>0, bin[i]>0, &"-abcdefghijklmnopqrstuvwxyz"[i-len] );
24
+ bin[i] -= (i>=len)*(bin[i] > 0);
25
+ i -= (i>=len)*(bin[i] > 0);
26
+ }
17
27
  //output
18
- for( p=“-abcdef…”; *p;p++)
19
- for( i=0; i<bin[*p]; i++)
20
- printf(%c”, *p);
28
+ printf("%s\n", str );
21
- printf(“\n”);
29
+ }
30
+
22
31
  ```

2

-用のループは要らない。

2022/11/25 08:03

投稿

matukeso
matukeso

スコア1685

answer CHANGED
@@ -1,7 +1,8 @@
1
- ットソートをかければ、頻度計量分で反復1回、頻度用にchar[128]あたりをとって配列一個。
1
+ ットソートをかければ、頻度計量分で反復1回、頻度用にchar[128]あたりをとって配列一個。
2
2
  あとは頻度を出力する分は入出力処理なので、二重ループでもOKと言い張る。
3
+ inputは、getcharをwhileとかで回せば無くなるけど、、
3
4
  ```C
4
- char input[51], bin[128]=“”;;
5
+ char input[51], bin[128]=“”;
5
6
  const char *p;
6
7
  int i;
7
8
  //input
@@ -10,12 +11,12 @@
10
11
  //process
11
12
  for(p=input; *p; p++)
12
13
  bin[ *p ]++;
14
+ bin[‘-‘]=bin[‘ ‘];
15
+ bin[‘ ‘]=0;
13
16
 
14
17
  //output
15
- for( i=0; i<bin[‘ ‘]; i++)
16
- printf(“%c”,‘-‘);
17
- for( p=“abcdef…”; *p;p++)
18
+ for( p=“-abcdef…”; *p;p++)
18
19
  for( i=0; i<bin[*p]; i++)
19
- printf(“%c”, *dc);
20
+ printf(“%c”, *p);
20
21
  printf(“\n”);
21
22
  ```

1

bin初期化

2022/11/25 04:29

投稿

matukeso
matukeso

スコア1685

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  バゲットソートをかければ、頻度計量分で反復1回、頻度用にchar[128]あたりをとって配列一個。
2
2
  あとは頻度を出力する分は入出力処理なので、二重ループでもOKと言い張る。
3
3
  ```C
4
- char input[51], bin[128];
4
+ char input[51], bin[128]=“”;;
5
5
  const char *p;
6
6
  int i;
7
7
  //input