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

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

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

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

Q&A

解決済

4回答

1172閲覧

2のべき乗の回数計算

ta-9

総合スコア11

C

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

1グッド

1クリップ

投稿2020/04/26 08:30

###やりたい事
0以上で2147483648未満のn(整数)を読み取った後に、n 以上の最小の2のべき乗を計算し
2のべき乗した回数を出力する。

###例
入力 35
出力 6
(35を超える最小の2のべき乗は64
64は2を6回かけているので出力は6)

c

1#include<stdio.h> 2 3int main(void){ 4 5long int n; 6long int k; 7//2乗した回数を入れる変数 8int p; 9 10scanf("%ld", &n); 11 12 for (p = 0; k >= n; p++) {...?? 13 14 } 15//繰り返した回数を計算しpに入れる...? 16p=...? 17 18//2乗した回数を出力 19printf("%ld\n",p); 20 21return 0; 22} 23
DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

2から初めて、べき乗数を計算して、入力値以上になったところで止めると、それが求める値です。

投稿2020/04/26 09:04

otn

総合スコア84499

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

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

ta-9

2020/04/26 11:42

恥ずかしながら難しく... for ( k = 2; k <= n; k++) { p = p+1; こんな感じでしょうか...?
otn

2020/04/26 11:50

日本語をそのままコードにすればいいのですが。。。 と、「入力値以上になったところで止めると」は同じ意味の「入力値未満の間ループ」に書き換えか。 for(p=2; p < n; p*=2);
otn

2020/04/26 12:12

ああ、回数か。 for(p=1, k=2; k < n; p++, k*=2);
ta-9

2020/04/26 12:28

for(p=1; p < n; p*=2){ p++ } で上手くいきました。 ありがとうございました。
otn

2020/04/26 12:32

↑違うと思いますが。
ta-9

2020/04/26 12:39

あら、pとk書き間違えてました。 //入力nを2のべき乗が超えるまで繰り返し for(k=1; k < n; k*=2){ //べき乗した回数のカウント p++ }
guest

0

x.c

c

1#include<stdio.h> 2 3int main(void) { 4 long int n; 5 scanf("%ld", &n); 6 7 int i = 1; 8 while ((n = (n >> 1))) { 9 i++; 10 } 11 printf("%ld = 2 ** %d\n", 1L << i, i); 12 13 return 0; 14}

実行例:
イメージ説明

投稿2020/04/27 20:43

katoy

総合スコア22324

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

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

0

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n, k = 0; 6 scanf("%d", &n); 7 while ((1u << k) < n) k++; 8 printf("%d\n", k); 9}

1u がキモです。

追記
別解

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n, k = 0; 6 scanf("%d", &n); 7 if (--n > 0) { 8 k = 1; 9 if (n > 0xffff) n >>= 16, k += 16; 10 if (n > 0x00ff) n >>= 8, k += 8; 11 if (n > 0x000f) n >>= 4, k += 4; 12 if (n > 0x0003) n >>= 2, k += 2; 13 if (n > 0x0001) n >>= 1, k += 1; 14 } 15 printf("%d\n", k); 16}

2 のべき乗は、0乗、1乗、2乗、... だから、1、2、4、...。
n が 0 の時、それ以上の 2 のべき乗は 1。回数は 0。
n が 1 の時、それ以上の 2 のべき乗は 1。回数は 0。
n が 2 の時、それ以上の 2 のべき乗は 2。回数は 1。
n が 3 の時、それ以上の 2 のべき乗は 4。回数は 2。
n が 4 の時、それ以上の 2 のべき乗は 4。回数は 2。
n が 5 の時、それ以上の 2 のべき乗は 8。回数は 3。

投稿2020/04/26 17:05

編集2020/04/28 02:37
kazuma-s

総合スコア8224

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

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

0

以下のようにしてください。

C

1#include<stdio.h> 2 3int main(void){ 4 5long int n; 6long int k; 7//2乗した回数を入れる変数 8int p; 9 10scanf("%ld", &n); 11p = 0; 12k = 1; 13for (; ; ) { 14 if (k >= n) break; 15 k *= 2; //2を掛ける 16 p++; //繰り返し回数に1加算 17} 18//繰り返した回数はpに入っている 19 20//2乗した回数を出力 21printf("%d\n",p); 22 23return 0; 24} 25

投稿2020/04/26 12:08

tatsu99

総合スコア5438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問