Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で1/nの最初のk桁を出力する方法|浮動小数点数を使わない実装を解説

整数 n を入力し、1/n の計算結果を指定した桁数(k)まで小数として出力するプログラムを考えます。浮動小数点数(float や double)を使えば簡単に実現できますが、ここでの課題は浮動小数点数を使わずに実装することです。

入力:n=5、k=5
出力:20000

これは、n=5、k=5 の場合、1/5 = 0.20000 という計算結果を小数点以下 5 桁まで表示することを意味します。

アルゴリズム

この問題は、割り算の筆算(長除法)の仕組みをそのままシミュレートすることで解決できます。各ステップでは、「現在の余り × 10」を n で割ることで次の桁を求め、その余りを次のステップへ引き継ぎます。

Start
Step 1 -> int型変数 n に 9、k に 7、remain に 1 を設定し、i を宣言する
Step 2 -> i = 0 から i < k の間、i を 1 ずつ増やしながら繰り返す
    ((10 * remain) / n) を出力する
    remain = (10 * remain) % n を計算する
Step 3 -> ループを抜ける
Stop

サンプルコード

#include<stdio.h>
int main() {
    int n = 9, k = 7, remain = 1, i; // n は 1/n の分母、k は求める小数の桁数
    printf("first %d digits of %d are : ", k, n);
    for(i = 0; i < k; i++) {
        printf("%d", ((10 * remain) / n));
        remain = (10 * remain) % n;
    }
    return 0;
}

プログラムのポイント

変数 remain には割り算の余りが保持され、ループのたびに 10 倍して次の桁を取り出します。この手法により、浮動小数点数の精度制限を受けずに、理論上は任意の桁数まで計算を続けることが可能です。

出力結果

上記のプログラムを実行すると、次の出力が得られます。

first 7 digits of 9 are : 1111111

1/9 = 0.111111… となるため、小数第 1 位から 7 桁分の「1111111」が正しく出力されています。同様に n=5、k=5 で実行すれば「20000」が得られます。

  1. C++で整数の各桁を拡大表示(ズーム)するプログラムの作り方

    この記事では、C++を使って整数の各桁を拡大表示(ズーム)するプログラムを紹介します。ここでの「ズーム」とは、数字を「#」などの記号を使って通常より大きな形で描画することを指します。考え方自体はシンプルですが、0から9までの各数字を大きな形式で一つずつパターン化する必要があります。 ズーム表示の基本的な考え方 各数字は5行×5列のグリッドとして表現します。二重のforループでグリッド全体を走査しながら、行・列の位置関係をもとに条件分岐を行い、「#」と空白のどちらを出力するかを決めます。たとえば「0」なら外枠だけを「#」で囲み、「8」なら上下の横線と左右の縦線を組み合わせて描画するといった具合で

  2. 1/1! + 2/2! + 3/3! + …… + n/n! の級数の合計を求めるPythonプログラム

    この記事では、与えられた問題を解くための解法とアプローチについて詳しく解説します。 問題文 整数 n が入力として与えられたとき、次の級数の合計を求めます。 1/1! + 2/2! + 3/3! + 4/4! + …… + n/n! ここでは for ループを使用して実装するため、時間計算量は O(n) となります。また、処理効率を高めるポイントとして、階乗の計算を同じループ内で同時に行っている点が挙げられます。 アルゴリズム 以下の手順で級数の合計を求めます。 合計値 res を 0、階乗値 fact を 1 で初期化します。 i を 1 から n まで順に処理し、fact *= i に