回答編集履歴
3
for文1個、条件分岐無しでかきなおし。
answer
CHANGED
@@ -1,22 +1,31 @@
|
|
1
|
-
バケットソートをかければ、頻度計量分で反復1回、頻度用に
|
1
|
+
バケットソートをかければ、頻度計量分で反復1回、頻度用にint[80]あたりをとって配列一個。
|
2
|
-
|
2
|
+
ループを多めに回すことで、頻度の計算と、結果の出力を一つのfor文にしている。スペースa-zは0x1fでANDをとるときれいいに0~27にならぶ。
|
3
|
-
|
3
|
+
if文で条件分岐できなくても、条件式の結果が1/0に成ることを利用した制御とか、ループ変数を書き換えるのは本来的には禁じ手とおもう。
|
4
|
+
|
4
5
|
```C
|
6
|
+
#include <stdio.h>
|
5
|
-
|
7
|
+
#include <string.h>
|
8
|
+
int main()
|
9
|
+
{
|
6
|
-
|
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(
|
16
|
+
scanf("%50s", str );
|
10
17
|
|
11
18
|
//process
|
19
|
+
len = strlen( str );
|
12
|
-
for(
|
20
|
+
for( i=0; i<len+27; i++){
|
13
|
-
bin[ *p ]++;
|
14
|
-
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
|
-
|
28
|
+
printf("%s\n", str );
|
21
|
-
|
29
|
+
}
|
30
|
+
|
22
31
|
```
|
2
-用のループは要らない。
answer
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
バ
|
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”, *
|
20
|
+
printf(“%c”, *p);
|
20
21
|
printf(“\n”);
|
21
22
|
```
|
1
bin初期化
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
|