プログラムの目的:
4桁以下の正の整数値に対して,各桁の数を並べ替えてできる「最大の整数値」と「最小の整数値」の差を計算し、整数値を作成。この作業を繰り返すと必ずある整数値に収束する。コマンドライン入力に4桁以下の正の整数値 ???? を入力すると,上記の計算を繰り返し,収束するまでの整数値を標準出力に出力するプログラムを作成したい。
もし桁数が4桁に満たない場合は、0を代入(もし21なら、0021と捉え、最大値2100と最小値12となる)。
質問内容: 4桁の値が全部同じ時(1111,9999など)、差を「0」と出力したいのに「0000」となってしまいます。なので、「4桁の数が全て同じ時は0を出力する」という場合分けで対処しました。ところが、この解答だとダメだということでした。他に0を消す方法が分からないので、教えていただければと思います。
c
1#include <stdio.h> 2#include <stdlib.h> 3 4void sort(char ar[]) { 5 int i, j, tmp, m, n, z; 6 char max[4], min[4], sum[4], final[4]={0}; 7 8 z = 0; 9 for (; z==0;) { 10 11 //まずは最大値 12 for (i=0; i<4; i++) { 13 for (j=3; j>i; j--) { 14 if (ar[j] > ar[j-1]) { 15 tmp = ar[j]; 16 ar[j] = ar[j-1]; 17 ar[j-1] = tmp; 18 } 19 } 20 } 21 for (i=0; i<4; i++) { 22 max[i] = ar[i]; 23 } 24 25 //次に最小値 26 for (i=0; i<4; i++) { 27 28 for (j=3; j>i; j--) { 29 if (ar[j] < ar[j-1]) { 30 tmp = ar[j]; 31 ar[j] = ar[j-1]; 32 ar[j-1] = tmp; 33 } 34 } 35 } 36 37 for (i=0; i<4; i++) { 38 min[i] = ar[i]; 39 40 } 41 //次は、最大値から最小値を引き続ける計算式。 42 m = 0; 43 n = 0; 44 45 //4桁の引き算 46 for (i=3; 0<=i; i--) { 47 if (m + max[i] - min[i] >= 0) { 48 n = m + max[i] - min[i]; 49 m = 0; 50 } else { 51 n = 10 + m + max[i] - min[i]; 52 m = -1; 53 } 54 sum[i] = n; 55 } 56 57 //4桁の数が全て同じの時は、0を一つだけ出力。 58 if (sum[0] == 0 && sum[1] == 0 && sum[2] == 0 && sum[3] == 0) { 59 printf("%d\n", 0); 60 break; 61 } else { 62 for (i=0; i<4; i++) { 63 printf("%d", sum[i]); 64 ar[i] = sum[i]; 65 } 66 } 67 printf("\n"); 68 if(final[0]==ar[0] && final[1]==ar[1] && final[2]==ar[2] && final[3]==ar[3]) { 69 break; 70 } else { 71 for (i=0; i<4; i++) final[i] = ar[i]; 72 } 73 } 74} 75 76int main(int argc, char *argv[]) { 77 int num; 78 char str[4]; 79 80 //4桁以下の整数を受けとり、atoi関数で数値化してnumに代入。 81 if ((0 < atoi(argv[1]) && atoi(argv[1]) < 10000)) num = atoi(argv[1]); 82 83 //numの値を配列strに格納していく。 84 str[0] = num / 1000; 85 str[1] = num % 1000 / 100; 86 str[2] = num % 100 / 10; 87 str[3] = num % 10; 88 89 sort(str); 90 91 return 0; 92} 93
回答5件
あなたの回答
tips
プレビュー