n S_1 D_1 S_2 D_2 ... S_i D_i ... S_n D_n
S_i は「文字」で、D_i は「整数」。
このような入力が行われるとき、D_iの大きさを基準にしてS_iとD_iを基準にして並び替えたい場合、どこを直したらいいでしょうか?
ただし、Sが被った場合、Sの列の整数を足さなければなりません。
以下は左が入力されたもの、右が出力しなければならないものです。
7 B 75 A 1 A 11 D 6 D 6 C 2 G 4 G 4 C 2 B 70 A 10 B 5
私は以下のようなコードを組んでいます。疑問点は文字が被ったところで整数を足し合わせる処理をしているにも関わらず整数が足されないところ、その後のprintfをどのように処理すればよいかというところです。どうかご教授お願いします。
C
1#include <stdio.h> 2#include <string.h> 3 4void swap_int(int *a,int *b){ 5 int temp = *a; 6 *a = *b; 7 *b = temp; 8} 9 10void swap_str(char *sa,char *sb){ 11 char temp[1000]; 12 strcpy(temp,sa); 13 strcpy(sa,sb); 14 strcpy(sb,temp); 15} 16 17void sort1(char str1[][1000],int num1[],int n1){ 18 int i,j; 19 for(i=0;i<n1-1;i++){ 20 for(j=n1-1;j > i;j--){ 21 if(num1[j-1] < num1[j]){ 22 swap_int(&num1[j-1],&num1[j]); 23 swap_str(str1[j-1] ,str1[j] ); 24 } 25 } 26 } 27} 28 29int main(void){ 30 31 char st[1000][1000],str[1000]; 32 int n,i,j,num[1000]; 33 fgets(str,"%s",stdin); 34 sscanf(str,"%d",&n); 35 for(i=0;i<n;i++){ 36 fgets(str,"%s",stdin); 37 sscanf(str,"%s%d",st[i],&num[i]); 38 } 39 40 sort1(st,num,n); ///一回目のソート 41 for(i=0;i<n;i++){ ///大きいものから順に、文字が被ればその列の整数を足し合わせる。 42 for(j=i+1;j<n;j++){ 43 if(st[i] == st[j]){ 44 num[i] += num[j]; 45 } 46 } 47 } 48 sort1(st,num,n); ///二回目のソート 49 50 for(i=0;i<n;i++){ 51 printf("%s %d\n", st[i],num[i]); 52 } 53 return 0; 54}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/19 15:58