C言語の問題です。
1から100までの整数に対して、6の倍数の合計を求めるプログラムを作成しなさい。ただし、for文とif文を用いて作成すること。
分からないです。お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/24 17:49
2017/06/24 17:58
2017/06/24 18:00
回答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
総合スコア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総合スコア18164
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/25 02:31
2017/06/25 03:01
2017/06/28 08:34
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
総合スコア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総合スコア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
総合スコア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
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。