🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2110閲覧

少数表示を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/11/12 13:48

編集2020/02/04 04:56

前提・実現したいこと

標準入力に与えられる2つの正整数 m, n ( 1 < n < 9500 ) を読み取り、 m/n の小数表示を標準出力に書き出すプログラムを作成したいです。
m, n は、m が n では割り切れないもので、出力は必要最小限の桁数で m を書き出し、 / に続いて必要最小限の桁数で n を書き出す。 続けて、空白を前後に置いて = を書き出し、整数部に続けて . を書き出し、 以後小数部を書き出して最後に改行を行え。 小数部は、循環小数になる場合は非循環部を書き出した後、' を書き出し1度だけ循環部を書き出し。 有限小数になる場合はその小数部を書き出すプログラムです。
実行例
標準入力
71 8
標準出力
71/8 = 8.875

該当のソースコード

C言語

#include <stdio.h>
#include <stdlib.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("r/q = ");
for(j= 1; j!=i; j++){
if( r!=0 && j==k ) printf("'");
printf("%d", qq[j]);
}
printf("\n");

return 0;
}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/11/12 14:02 編集

“循環小数になる場合”は、どうやって判断するのでしょう? 1/41(0.02439024390243902・・・)等
HogeAnimalLover

2019/11/12 13:59

循環小数の判定は素因数分解を使えばできます。
cateye

2019/11/12 14:07 編集

HogeAnimalLoverさん、認識不足でした。有難うございます。
jimbe

2019/11/12 18:03

ご提示のコードは何でしょう.
退会済みユーザー

退会済みユーザー

2019/11/12 23:11

jimbeさん、ご質問ありがとうございます。コードはC言語になります。
jimbe

2019/11/13 00:47

いえ, 作成したいという仕様は書かれていますが, ご提示の(標準入力から1つしか読み取っていない)コードについての説明がありません, ということです.
ttyp03

2019/11/13 00:56

普通に割り算してprintfで書式調整じゃダメなん?
guest

回答3

0

C

1#include <stdio.h> 2 3#define NUM 9500 4 5int main(void) 6{ 7 int i, j, m, n, m0, q[NUM], p[NUM] = { 1 }; 8 if (scanf("%d%d", &m, &n) != 2 || m < 1 || n <= 1 || n >= NUM) return 1; 9 m0 = m; 10 for (i = 0; i < NUM; i++) { 11 q[i] = m / n; 12 m %= n; 13 if (p[m]) break; 14 p[m] = i + 1; 15 m *= 10; 16 } 17 printf("%d/%d = %d", m0, n, q[0]); 18 if (m || i > 0) putchar('.'); 19 for (j = 1; j <= i; j++) { 20 if (m && j == p[m]) putchar('\''); 21 printf("%d", q[j]); 22 } 23 printf("\n"); 24 return 0; 25} 26

理解できましたか?
疑問点は質問してください。

追記
ちょっとソースを修正しました。

投稿2019/11/13 12:29

編集2019/11/13 12:45
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/13 12:56

ご回答有難うございます! 無事解決しました(^^)
kazuma-s

2019/11/13 13:03

解決しましたということは、 コードが完全に理解できて、何の疑問もないということですか?
za-to

2021/07/16 06:51

すみません、数年前に解決済みかもしれませんが、kazuma-sさんの回答したプログラムについて質問したいのですが、宜しいでしょうか❓
kazuma-s

2021/07/16 07:18

このページにリンクを張って、新規の質問にしてください。
guest

0

ベストアンサー

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define UPPER_BOUND (9500) 5#define LOWER_BOUND (1) 6#define NO_OCCURRENCE (-1) 7 8void showQuotient(int dividend, int divisor) { 9 int quotient = dividend / divisor; 10 int remainder = dividend % divisor; 11 12 printf("%d/%d = %d", dividend, divisor, quotient); 13 if (remainder != 0) { 14 putchar('.'); 15 16 char* fractionDigits = malloc(divisor); 17 int* occurrence = malloc(sizeof(int) * divisor); 18 for (int pos = 0; pos < divisor; ++pos) 19 occurrence[pos] = NO_OCCURRENCE; 20 21 int fractionPos = 0; 22 for (fractionPos = 0; remainder != 0 && occurrence[remainder] == NO_OCCURRENCE; ++fractionPos) { 23 occurrence[remainder] = fractionPos; 24 remainder *= 10; 25 quotient = remainder / divisor; 26 fractionDigits[fractionPos] = quotient + '0'; 27 remainder %= divisor; 28 } 29 30 int displayPos = 0; 31 if (remainder != 0) { 32 for (; displayPos < occurrence[remainder]; ++displayPos) 33 putchar(fractionDigits[displayPos]); 34 putchar('\''); 35 } 36 for(; displayPos < fractionPos; ++displayPos) 37 putchar(fractionDigits[displayPos]); 38 39 free(occurrence); 40 free(fractionDigits); 41 } 42 putchar('\n'); 43} 44 45int main() { 46 int dividend, divisor; 47 48 scanf("%d", &dividend); 49 if(dividend <= LOWER_BOUND || dividend >= UPPER_BOUND) { 50 return 1; 51 } 52 scanf("%d", &divisor); 53 if (divisor <= LOWER_BOUND || divisor >= UPPER_BOUND) { 54 return 1; 55 } 56 57 showQuotient(dividend, divisor); 58 59 return 0; 60}

投稿2019/11/13 03:38

Bearded-Ockham

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/13 11:32

ご回答有難うござます!大変助かります! 標準入力 71 8 標準出力 71/8 = 8.875  上記では問題なくクリアできましたが 標準入力の桁が多くなるとエラーがでてしまいました。 もう私では何が何だか...。 可能であれば教えて頂きたく。。。 標準入力 10000 14141↵ 結果 → 「実行時エラーが発生しました」のみ表示されます。 正解の標準出力 10000/14141 = 0.'7071635669330316102114419065129764514532211300473799589845131178841666077363694222473658157131744572519623788982391627183367512905735096527826886358814793861820239021285623364684251467364401386040591188741956014426136765433844848313414892864719609645711052966551163284067604836998797821936213846262640548758927940032529524078919454069726327699596916766848171982179478113287603422671663955872993423378827522806025033590269429319001485043490559366381444028003677250548051764373099497913867477547556749876246375786719468212997666360229120995686302241708507177710204370270843646135351106710982250194469980906583692808146524291068524149635810763029488720741107418145817127501591118025599321122975744289654197015769747542606604907715154515239374867406831200056573085354642528816915352521038116116257690403790396718761049430733328618909553779789265257053956580156990311859133017466940103245880772222615090870518350894561912170284986917474011738915211088324729509935648115409094123470758786507319142917756877165688423732409306272540838695990382575489710770101124390071423520260236192631355632557810621596775334134785375857435824906300827381373311646983947387030620182448200268722155434552011880347924474931051552224029418004384414114984795983310939820380453999009971006293755745703981330881832967965490417933668057421681634962166749169082808853687858001555759847252669542465172194328548193197086486104235909765928859345166537020012728944204794568983805954317233576126157980340852839261721236121914998939254649600452584682837140230535322820168304928930061523230323173750088395445866628951276430238314122056431652641255922494873064139735520825967046177780920726964146807156495297362279895339792093911321688706597836079485184923272752987766070292058553143342055017325507389859274450180326709567923060603917686160808995120571388162081889541050845060462484972774202673078283006859486599250406619050986493175871579096244961459585602149777243476416095042783395799448412417792235344035075312919878367866487518563043631992079768050350045965631850647054663743723923343469344459373453079697333993352662470829502864012446078778021356339721377554628385545576691888833887278127430874761332296160101831553638356551870447634537868609009263842726822714093769888975319991514037196803620677462697121844282582561346439431440492185842585390000↵
Bearded-Ockham

2019/11/13 12:12

10000 14141 の間が全角スペースになっています。scanfによる入力は適当なので、入力する側がきちんとしたデータを入力しないとうまく動きません。また、ちゃんと入力しても、そもそも、あなたの言った条件が`1 < n < 9500`となっているので、14141は自分の言った条件にあてはまりません。自分がしようとしていることを理解しているのですか。
退会済みユーザー

退会済みユーザー

2019/11/13 12:29

再度内容を確認し実行したら、無事行けました。 有難うございました!
guest

0

そもそも挙げられたコードだと scanf() が一つしかないので、「二つの整数を標準入力で与える」事自体ができていませんよ?

二つの数値が与えられたなら、

  1. m を n で割った商(p)と余り(q)を求める
  2. p を出力
  3. q == 0 ならば処理終了
  4. q が 0 でないならば、'.' を出力(ただし一度だけ)し、m = q * 10 として、1. へ戻る

というのが処理になりますね(筆算による除算を再現しているだけです)

投稿2019/11/12 23:52

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/13 12:57

ご回答有難う御座います! 無事解決しました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問