質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

コマンド-分数の小数表示

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,051
退会済みユーザー

退会済みユーザー

■やりたい事
コマンド行引数として与えられる2つの正整数 m, n ( 1 < n < 10000000 ) を読み取り、m/n の小数表示を標準出力に書き出すプログラムを作る。
与えられる m, n は、m が n では割り切れないものとする。出力は左詰に m を書き出し、 / に続いて n を書き出す。 続けて、空白を前後に置いて = を書き出し、整数部に続けて . を書き出し、以後小数部を書き出して最後に改行を行え。 小数部は、循環小数になる場合は非循環部を書き出した後、' を書き出し1度だけ循環部を書き出すこと。 有限小数になる場合はその小数部を書き出すこと。
実行例
コマンドライン入力
71 8
標準入力
標準出力
71/8 = 8.875
コマンドライン入力
13 7
標準入力
標準出力
13/7 = 1.'857142
コマンドライン入力
10 6
標準入力
標準出力
10/6 = 1.'6
■自分なりに作成してみましたが思うような出力となりません。
修正箇所等教えて頂きたく。

#include <stdio.h>
int main(int argc, char *argv[]){
 int n;

 scanf("%d", &n);
 int rr[n], qq[n];  
 int r, q, i, j, k;  
 r= 1; k= 0;
 for(i= 1; r!=0 && k==0; i++){
   rr[i]= r;
   r*= 10;
   q= r/n; qq[i]= q;
   r= r%n;
   for(k= i; k!=0 && rr[k]!=r; k--);
 }
 printf("0.");
 for(j= 1; j!=i; j++){
   if( r!=0 && j==k ) printf("'");
   printf("%d", qq[j]);
 }
 printf("\n");
 return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2019/11/17 13:34 編集

    https://teratail.com/questions/223523 の質問が生かされていません→コマンド行引数
    「循環小数」の判定は?
    https://teratail.com/help/avoid-asking

    キャンセル

  • yukke_

    2019/11/17 17:59

    https://teratail.com/help/avoid-asking
    > コードをください・デバッグしてください等の丸投げの質問
    を読んで出直してきてください。

    キャンセル

  • 退会済みユーザー

    2019/11/23 23:43

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

0

修正箇所等教えて頂きたく。

コマンド行引数として与えられる2つの正整数 m, n ( 1 < n < 9500 ) を
とあるのに、n を標準入力から読み込もうとしています。
コマンド行引数から読み込むように修正してください。

m を全く読み込んでいません。
コマンド行引数から読み込むように修正してください。

m と n が 71 と 8 のとき、出力は 8.87 なのに
printf("0."); と書いています。修正してください。

コード全体を修正すると、

#include <stdio.h>   // printf, putchar
#include <stdlib.h>  // atoi

#define NUM 9500

int main(int argc, char *argv[])
{
    int i, j, m, n, m0, q[NUM], p[NUM] = { 1 };
    if (argc != 3) return 1;
    m = atoi(argv[1]);
    n = atoi(argv[2]);
    if (m < 1 || n <= 1 || n >= NUM) return 2;
    m0 = m;
    for (i = 0; i < NUM; i++) {
        q[i] = m / n;
        m %= n;
        if (p[m]) break;
        p[m] = i + 1;
        m *= 10;
    }
    printf("%d/%d = %d", m0, n, q[0]);
    if (m || i > 0) putchar('.');
    for (j = 1; j <= i; j++) {
        if (m && j == p[m]) putchar('\'');
        printf("%d", q[j]);
    }
    printf("\n");
    return 0;
}


どの部分が分からないのかを質問してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/23 22:35

    ちょっと待ってください。私のコードでは n が 9500以上の時は終了するようになっています。「実行時エラーが発生しました」と出ることはありません。本当にこのプログラムを実行していますか?

    キャンセル

  • 2019/11/23 23:41

    ご回答有難うございます。
    勿論( 1 < n < 9500 )の間であれば問題無く実行できました。
    ただ興味本位でコマンドラインの桁を増やして実行した所エラーとなりました

    ■やったこと
    #define NUM 9500から10000000へ変更

    コマンドライン
    8203125 9765625
    結果
    8203125/9765625 = 084

    欲しい結果
    8203125/9765625 = 0.84

    キャンセル

  • 2019/11/24 00:41

    なぜ、その変更を伏せて、いいがかりをつけるんですか?
    やはり私のコードではなく、あなたが改変したコードだったわけです。
    それを隠して「実行時エラーが発生しました」と言われても、回答のしようがありません。
    本当は質問するときには、OS は何か、コンパイラは何か、どのようにしてコンパイルしたかなどの情報も付けないと、正しい回答をすることができない場合もあります。

    さて、NUM の値をそんなに大きくすると、int q[NUM], p[NUM] は 80Mバイト必要になります。
    q も p も main のローカル変数であり、自動変数でもあるので、スタック上に領域を確保します。
    ところがスタックというのは通常そんなに多くのメモリを割り当てないことになっているので、実行エラーになることがあります。
    q と p をグローバル変数にして静的変数にするか、あるいは、
    static int q[NUM], p[NUM]; として、ローカル変数でありながら静的変数にすることで、
    スタック以外のメモリに割り付けられるようにしてみてください。
    どうなりますか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る