2の逆数のとき0.5
6の逆数のとき0.1(6)
7の逆数のとき0.(142857)
ある整数を入力した際上のように表示するプログラムを
作っていただきたいです
どなたかご協力お願いします
入力した整数の逆数を小数で求める
Re: 入力した整数の逆数を小数で求める
数字の周りに括弧が付いたり付かなかったりするのはどういう意味があるのでしょう。
それから、できる部分までで結構ですからソースコードを書いて投稿してください。
今のままですと、掲示板で禁止されている「課題の丸投げ」の状態になっております。
それから、できる部分までで結構ですからソースコードを書いて投稿してください。
今のままですと、掲示板で禁止されている「課題の丸投げ」の状態になっております。
Re: 入力した整数の逆数を小数で求める
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
#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: 入力した整数の逆数を小数で求める
次のアルゴリズムでできますよ。
#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;
}
Re: 入力した整数の逆数を小数で求める
完成したら、コードの提示をお願いします。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: 入力した整数の逆数を小数で求める
質問者からは、まだ完成したコードが提示されていません
が、別解があるので、それを提示します。
入力する値に NUM という制限をつけたくないのと、
p[ ] の初期化をしたくないという、
ちょっと無茶な要求に答えるものです。
未初期化変数を参照して、しかも正しく動く変なプログラムです。
が、別解があるので、それを提示します。
入力する値に 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;
}