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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

6回答

138閲覧

プログラム言語の課題

ojii-111

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

2クリップ

投稿2017/06/24 17:20

C言語の問題です。
1から100までの整数に対して、6の倍数の合計を求めるプログラムを作成しなさい。ただし、for文とif文を用いて作成すること。

分からないです。お願いします。

strike1217, faketurn👍を押しています

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

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

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

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

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

kei344

2017/06/24 17:49

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。また、質問文に「C言語」と書きながら質問タグに「JavaScript」を選択しているのは何か理由がありますか?
ojii-111

2017/06/24 17:58

関連タグの事がいまいち分かっていません。特に理由はないです。
kei344

2017/06/24 18:00

「C言語」に編集された上でご自身で書かれたコードを提示ください。
guest

回答6

0

for文とif文を用いて作成すること。

ここは、「for文とif文を用いずに作成すること。」の間違いですよね?for文とif文を使うなんて当たり前すぎて、問題になっていませんから、あえて使わないという問題に違いありません!

ということで作ってみましたが、結構難しいです。もうちょっと最適化できそう。

C

1#include <stdio.h> 2#include <stdint.h> 3#include <stdbool.h> 4#include <inttypes.h> 5 6struct range { 7 intmax_t begin; 8 intmax_t end; 9 intmax_t step; 10}; 11 12struct range range_create(intmax_t begin, intmax_t end, intmax_t step) 13{ 14 return (struct range){ 15 .begin = begin, 16 .end = end, 17 .step = step 18 }; 19} 20 21bool range_is_empty(const struct range rng) 22{ 23 return rng.begin > rng.end; 24} 25 26struct range range_next(const struct range rng) 27{ 28 return range_create(rng.begin + rng.step, rng.end, rng.step); 29} 30 31inline static intmax_t sum_with_init(const struct range rng, bool(*condition)(intmax_t), const intmax_t init) 32{ 33 return range_is_empty(rng) ? init : sum_with_init(range_next(rng), condition, init + (condition(rng.begin) ? rng.begin : 0)); 34} 35 36intmax_t sum(const struct range rng, const bool(*condition)(intmax_t)) 37{ 38 return sum_with_init(rng, condition, 0); 39} 40 41bool divadable_six(intmax_t i) 42{ 43 return i % 6 == 0; 44} 45 46int main(void) 47{ 48 printf("%" PRIdMAX "\n", sum(range_create(1, 100, 1), divadable_six)); 49 return 0; 50}

if文の代わりに使えるのは三項演算子と論理演算子ぐらいしかありません。短絡評価ができるのはこれぐらいだからです。ループは再帰にすれば良いだけのなので簡単です。末尾再帰にして適度に最適化すれば、今時のコンパイラだとスタックオーバーフローも起こさないようにループに書き換えてくれるはずです。

それにしても、Cにラムダ式欲しいです。divadable_six()と書くしかないのがすごくダサい。

投稿2017/06/24 21:48

raccy

総合スコア21735

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

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

0

C言語の質問で [JavaScript] のタグが付いているのは、「JavaScriptでコードを貰えれば、自分でC言語に変換して対応します!」という自己表明であると判断します。

while 文

繰り返し処理で最速と思われるwhile文。
このコードを発展させる事である「数式」が浮かび上がります。

JavaScript

1'use strict'; 2var i = 1, iMax = Math.floor(100/6) + 1, result = 0; 3 4while (i < iMax) { 5 result += 6 * i++; 6} 7 8console.log(result); // 816

自然数の和 (本回答の中で最速)

while文を発展させたコード。
6の倍数の総和も6の倍数です。
では、乗数に注目してみると「自然数の和」である事が分かります(下記2行のコードは等価です)。

JavaScript

16 * 1 + 6 * 2 + 6 * 3; 26 * (1 + 2 + 3);

1からNまでの自然数の和は「N * (N + 1) / 2」で求められる事を利用します。

JavaScript

1var number = Math.floor(100/6); 2number = 6 * number * (number + 1) / 2; 3 4console.log(number); // 816

for 文

while 文があるなら for 文も楽勝ですよね。
あれ?if文がない…。

JavaScript

1'use strict'; 2var result = 0; 3 4for (var i = 1, iMax = Math.floor(100/6) + 1; i < iMax; ++i) { 5 result += 6 * i; 6} 7 8console.log(result); // 816

for + if 文 (非最適化版)

し、仕方がないので最適化をなくして、効率を落としたコードに変更しましょう。

JavaScript

1'use strict'; 2var result = 0; 3 4for (var i = 1; i < 101; ++i) { 5 if (i % 6 === 0) { 6 result += i; 7 } 8} 9 10console.log(result); // 816

「せんせー。if文を使ったコードは冗長で筋が悪いと思います!」

更新履歴

  • 2017/06/25 11:59 「自然数の和」を利用したコードを追記。私が思いつく中では最速。

Re: ojii-111 さん

投稿2017/06/25 02:27

編集2017/06/25 03:06
think49

総合スコア18164

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

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

think49

2017/06/25 02:31

余談なのでコメント欄に書きますが、この問題は私にとって難問でした。どう頑張っても、「if文を使ったコードが出てこない」のです…。 どうやって効率を落とすか延々と悩み、「練習問題によくある解」で妥協しました。 もう少し、エレガントにif文を使ったコードにしたかったのですが、効率を落とした時点でエレガントも何もあったものではないですよね。
think49

2017/06/25 03:01

「自然数の和」を利用したコードを追記しました。 数学的な解は最適化の幅を広げますね。
momon-ga

2017/06/28 08:34

すごい!質問者さんの意図とは違うけど、流行させようと思います。 合計を求めるだけなら、たしかにif文いらないですね。
guest

0

「質問への追記・修正の依頼」で指摘しても質問タグが編集されないところを見ると、「C言語で問題が出たがあえてJavaScriptで聞きたい」ということでしょうか。それでもご自身で書いたコードを提示した上でわからないところを聞くほうが良いですよ。

JavaScript

1let i=100,x=0;for(;i;i--)if(i%6==0){x+=i}; 2console.log(x);

if を使わないほうが少しだけ短いコードになります。

JavaScript

1let j=100,y=0;while(j--)j%6==0&&(y+=j); 2console.log(y); 3let k=0,z=0;for(;k*6<=100;k++)z+=k*6; 4console.log(z);

投稿2017/06/25 02:10

kei344

総合スコア69407

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

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

0

ベストアンサー

簡単なfor文の方で

c

1#include <stdio.h> 2void main(void) 3{ 4 int i,j=0; 5 for(i=1;i<=100;i++) if (!(i%6)) j+=i; 6 printf("%d\n",j); 7}

投稿2017/06/24 23:30

編集2017/06/26 22:58
A.Ichi

総合スコア4070

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

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

0

for文とif文を用いずに作成すること。

6 + 12 + ... + 96 の等差数列の和として計算すればよいのでは?

a0 = 6
an = (100 / 6) * 6
n = an / n
sum = n * (an + 1) / 2

for文とif文を用いて作成すること。

c

1#include <stdio.h> 2int main(void) { 3 int sum = 0; 4 5 // 1から100までの整数に対して 6 for (int i = 1; i <= 100; i++) { 7 // 6 の倍数なら、合計していく 8 if (i % 6 == 0) { 9 sum += i; 10 } 11 } 12 13 printf("%d\n", sum); 14 return 0; 15}

投稿2017/06/26 15:25

katoy

総合スコア22324

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

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

0

こうとか。

C

1#include <stdio.h> 2 3int main(){ 4 int ar[100] = {0}; 5 int i; 6 int *p; 7 8 for(p = ar, i = 1; i * 6 <= 100;) 9 *p++ = 6 * i++; 10 11 for(p -= (i-1), i = 0; *p != 0;) 12 i += *p++; 13 14 if( i == 816 ) 15 printf("%d", i); 16 17 return 0; 18}

投稿2017/06/24 18:50

編集2017/06/24 18:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問