非常に
C言語の問題集の回答がないので困っているので誰か教えてください。
私はまだ始めたばかりなので手におえません。
今私が理解しているif文、switch文、for文、while文、do-while文、配列、を
使用してでお願いします。
「カプレカの定理」をプログラムを使って考察しなさい.
今回は4桁の場合のプログラムを作成しばさい.
プログラムの仕様は以下のものとする.
4桁の入力がなされるまで,do-while文を用いてscanfを繰り返す.
int型の配列 digit[4] を用意し,それぞれに1~1000の位を割り当てる.
桁の分割方法は各自考えよ.
(例)
3175
digit[0] = 3
digit[1] = 1
digit[2] = 7
digit[3] = 5
配列 digit をバブルソートを用い昇順または降順に並べ,それを基に
最大の4桁と最小の4桁を算出する
実行結果例
Input -> 123
Input -> 12345
Input -> 1234 (*4桁の数が入力されるまで繰り返している。この括弧内は説明なので表示させる必要はない)
4321 - 1234 = 3087
8730 - 378 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
// Kaprekar.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdio.h"
#include "string.h"
static int digit[4];
// digit[]の2つの値を交換します
static void Swap(int i, int j)
{
int tmp = digit[i];
digit[i] = digit[j];
digit[j] = tmp;
}
// バブル・ソートを用いてdigit[]を昇順にソートします
static void SortAsc()
{
int i;
for (i = 0; i < 4; ++i)
{
int j;
for (j = 1; j < 4 - i; ++j)
{
if (digit[j] > digit[j - 1])
{
Swap(j, j - 1);
}
}
}
}
// バブル・ソートを用いてdigit[]を降順にソートします
static void SortDesc()
{
int i;
for (i = 0; i < 4; ++i)
{
int j;
for (j = 1; j < 4 - i; ++j)
{
if (digit[j] < digit[j - 1])
{
Swap(j, j - 1);
}
}
}
}
// digit[]を数値に直す
static int GetValue()
{
return (digit[0] - '0') * 1000 +
(digit[1] - '0') * 100 + (digit[2] - '0') * 10 + digit[3] - '0';
}
int main(int argc, char* argv[])
{
// 1000文字以上の入力はあり得ないという前提とする
char Input[1001];
char Text[5];
//4桁の入力がなされるまで,do-while文を用いてscanfを繰り返す.
do
{
printf("Input -> ");
scanf("%s", Input);
} while (strlen(Input) != 4);
// 対象となる数値の文字列表現を取得する
strncpy(Text, Input, 4);
Text[4] = '\0';
while (1)
{
static int OldV = 0;
int max, min, v, i;
// 文字列を並び替えてできる最大値を取得する
// 題意によりdigit[]配列に格納する必要がある
for (i = 0; i < 4; ++i)
{
digit[i] = Text[i];
}
SortAsc();
max = GetValue();
// 文字列を並び替えてできる最小値を取得する
// 題意によりdigit[]配列に格納する必要がある
for (i = 0; i < 4; ++i)
{
digit[i] = Text[i];
}
SortDesc();
min = GetValue();
v = max - min;
printf("%d - %d = %d\n", max, min, v);
sprintf(Text, "%04d", v);
// 同じ計算結果が2回続いたら終了
if (OldV == v)
{
return 0;
}
OldV = v;
}
return 0;
}
- 最新から表示
- |
- 回答順に表示













