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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C

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

Q&A

2回答

485閲覧

C言語 10進で出力

ta-9

総合スコア11

C

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

0グッド

0クリップ

投稿2020/05/31 00:57

編集2020/05/31 04:22

###質問したい事

整数n(1を超え10000未満)を入力した時、その整数桁未満の3のべき乗でもっとも大きいものを出力するようにするにはどう書けば良いか教えてください。


入力 15
出力 68630377364883

入力 26
出力 6461081889226673298932241

C

1#include <stdio.h> 2 3#define N 10000 4 5... 6 7int main(void) 8{ 9

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/31 01:06

https://teratail.com/help/avoid-asking > コードをください・デバッグしてください等の丸投げの質問 > > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。 > 問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。 > まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。
ta-9

2020/05/31 02:26

raccyさんご質問ありがとうございます。 その質問はn以下のようですが今回のはnの桁数未満です。
raccy

2020/05/31 02:44

例では15桁未満では9となっていますが、15桁未満でもっとも大きい3の冪乗は3の29乗の68630377364883になると思うのですが、問題文または例のどちらかが間違ってませんか?
ta-9

2020/05/31 02:54

15は2桁なので2桁未満(=1桁)で最大の3のべき乗は9です。
raccy

2020/05/31 03:46

つまりは、15は「9以下」、126は「99以下」の最大の3のべき乗を計算して出力する、ということであってますか?それなら、入力されたnに対して、nより1桁すくない「9...9以下」がわかれば、2のべき乗と同じ方法で解けませんか?
raccy

2020/05/31 03:49

あと、1~9の場合は、1桁未満、つまり0桁ですが、3の0乗でも1なので、解なしになると思われるのですが、その場合は、どのような出力になるのですか?
ta-9

2020/05/31 04:09

勘違いしていました。申し訳ございません。 正しくは 15は15桁という意味でそれの桁未満(=14桁)の最大なので出力は「68630377364883」です。 もう一つの例も同様の意味です。 質問の例の値を修正させて頂きました。
raccy

2020/05/31 04:18

26のときは6461081889226673298932241ではないのですか?引用元も何も書いていないので、この問題文はあなたが考えたのですよね?質問や例が正確ではないと、何が正解なのかを判断できません。最大で9999桁の数字を出力する問題と言うことであってますか?
ta-9

2020/05/31 04:27

失礼しました。26の時の最大は6461081889226673298932241でした。 nの範囲は1<n<10000で間違いありません。ただ9999桁の出力では無くn未満の為出力最大桁数は9998桁になります。
guest

回答2

0

3倍を繰り返すだけの多倍長計算は簡単です。遅いけど。

C

1#include <stdio.h> 2#include <math.h> // log10 3 4int main(void) 5{ 6 int a[10000]; 7 int n; 8 if (scanf("%d", &n) != 1 || n <= 1 || n >= 10000) return 1; 9 int k = --n / log10(3); 10 a[0] = 1; 11 for (int i = 1; i < n; i++) a[i] = 0; 12 for (int i = 0; i < k; i++) 13 for (int c = 0, j = 0; j < n; j++) 14 a[j] = a[j] * 3 + c, c = a[j] / 10, a[j] %= 10; 15 while (--n >= 0) printf("%d", a[n]); 16 putchar('\n'); 17}

理解できない場合は、どこが分からないのかを必ず質問してください。

投稿2020/05/31 09:10

編集2020/05/31 09:11
kazuma-s

総合スコア8224

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

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

0

出力される数値はunsigned long longを遥かに超えます。これを実現するには、多倍長整数を実装するか、一桁づつ計算することになります。一桁ずつ計算は無駄も多く、多倍長整数を自分で実装するのは大変なので、適当な多倍長整数ライブラリを使った方が早いです。下記はGMPを使った場合です。

C

1#include <stdio.h> 2#include <math.h> 3#include <gmp.h> 4 5int main(void) 6{ 7 int n; 8 if (scanf("%d", &n) != 1 || n <= 1 || n >= 10000) return 1; 9 int e = (n - 1) / log10(3); 10 mpz_t x; 11 mpz_init(x); 12 mpz_ui_pow_ui(x, 3, e); 13 mpz_out_str(stdout, 10, x); 14 mpz_clear(x); 15 printf("\n"); 16 return 0; 17}

投稿2020/05/31 05:03

raccy

総合スコア21737

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

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

ta-9

2020/05/31 06:24

ご回答ありがとうございます。助かります。 ただコンパイルエラーとなる為、もう少し考えてみます。 (GMPファイルを上手くインストール出来ないのが原因かも)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問