入力した整数の逆数を小数で求める

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
GYRO
記事: 4
登録日時: 11年前

入力した整数の逆数を小数で求める

#1

投稿記事 by GYRO » 11年前

2の逆数のとき0.5
6の逆数のとき0.1(6)
7の逆数のとき0.(142857)

ある整数を入力した際上のように表示するプログラムを
作っていただきたいです
どなたかご協力お願いします

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 入力した整数の逆数を小数で求める

#2

投稿記事 by beatle » 11年前

数字の周りに括弧が付いたり付かなかったりするのはどういう意味があるのでしょう。

それから、できる部分までで結構ですからソースコードを書いて投稿してください。
今のままですと、掲示板で禁止されている「課題の丸投げ」の状態になっております。

GYRO
記事: 4
登録日時: 11年前

Re: 入力した整数の逆数を小数で求める

#3

投稿記事 by GYRO » 11年前

code

#include <stdio.h>
#define NUM 50
int main(void){
int i;
int n;
int m;
printf("整数を入力してください: ");
scanf("%d", &n);

printf("%d.", 1 / n);
m = 1 % n * 10;

for (i = 0; i < NUM; i++) {
printf("%d", m / n);
m %= n;

if (m == 0) {
break;
}
else {
m *= 10;
}
}
printf("\n");

return 0;
}

/code

循環小数の場合同じ数字がずっと続いてしまうので
同じ数字のところを括弧で囲んで表示したいと思っています
http://www.highflyer2.com/math/junkan.html

かずま

Re: 入力した整数の逆数を小数で求める

#4

投稿記事 by かずま » 11年前

次のアルゴリズムでできますよ。

コード:

● n で割った商は、出力せずに配列に憶えておく。
● n で割った余りは、出た時の位置を配列に憶えておき、
   既に出たものであればループを抜ける。

コード:

#include <stdio.h>

#define NUM 1000

int main(void)
{
    int i, j, n, m = 1, q[NUM], p[NUM] = { 0 };
    printf("整数を入力してください: ");
    if (scanf("%d", &n) != 1 || n <= 1 || n >= NUM) return 1;
    for (i = 0; i < NUM; i++) {
        q[i] = m / n;  // 商を憶えておく
        m %= n;        // 余りを求める
        if (m == 0 || p[m]) break;  // 割り切れるか、既に出た余りなら抜ける
        p[m] = i;     // 余りの位置を憶えておく
        m *= 10;
    }
    printf("0.");
    // この出力は、自分で考えてください。i, p[m], q[] を見れば分かります
    printf("\n");
    return 0;
}

GYRO
記事: 4
登録日時: 11年前

Re: 入力した整数の逆数を小数で求める

#5

投稿記事 by GYRO » 11年前

もうすこしで完成できそうな気がします
ありがとうございます!

かずま

Re: 入力した整数の逆数を小数で求める

#6

投稿記事 by かずま » 11年前

GYRO さんが書きました:もうすこしで完成できそうな気がします
完成したら、コードの提示をお願いします。

ちょっと、改良してみました。
p[0] に 1 を入れておくと、ループを抜ける条件が簡単になります。
p[m] に入れる値を +1 しておくと、q[] の出力が簡単になります。

コード:

#include <stdio.h>

#define NUM 1000

int main(void)
{
    int i, j, n, m = 1, q[NUM], p[NUM] = { 1 };
    printf("整数を入力してください: ");
    if (scanf("%d", &n) != 1 || n <= 1 || n >= NUM) return 1;
    for (i = 0; i < NUM; i++) {
        q[i] = m / n;    // 商(quotient)を憶えておく
        m %= n;          // 余りを憶えておく
        if (p[m]) break; // 既に出た余りなら抜ける
        p[m] = i + 1;    // 余りの位置(position)を憶えておく
        m *= 10;
    }
    printf("0.");
    // q[] を出力
    printf("\n");
    return 0;
}

かずま

Re: 入力した整数の逆数を小数で求める

#7

投稿記事 by かずま » 11年前

質問者からは、まだ完成したコードが提示されていません
が、別解があるので、それを提示します。

入力する値に NUM という制限をつけたくないのと、
p[ ] の初期化をしたくないという、
ちょっと無茶な要求に答えるものです。

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, j, m = 1, n, *p, *q, *r; 
    printf("整数を入力してください: "); 
    if (scanf("%d", &n) != 1 || n <= 1) return 1;
    p = malloc((3*n + 1) * sizeof(int)); // position
    if (!p) return 1;
    q = p + n;  // quotient
    r = q + n,  // remainer
    r[0] = p[0] = 0;
    for (i = 1; ; i++) {
        r[i] = m %= n; // 余りを求めて、憶えておく
        j = p[m];      // 余りの位置(ただし、未初期化の場合あり) 
        if (j >= 0 && j < i && r[j] == m) break; // 余りが既出なら抜ける
        p[m] = i;      // 余りの位置を憶えておく
        m *= 10;       // 次の桁の計算に備える
        q[i] = m / n;  // 商を憶えておく
    }   
    printf("0.");
    for (j = 1; j < p[m]; j++) printf("%d", q[j]);
    if (m) printf("(");
    for (; j < i; j++) printf("%d", q[j]);
    if (m) printf(")");
    printf("\n");
    free(p);
    return 0;
}
未初期化変数を参照して、しかも正しく動く変なプログラムです。

GYRO
記事: 4
登録日時: 11年前

Re: 入力した整数の逆数を小数で求める

#8

投稿記事 by GYRO » 11年前

テスト勉強をしていてすっかり忘れていました

いろいろとありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る