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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

11回答

5069閲覧

連続する数字の和をプログラミングで表現すると?例⇒ 1+2+3+4+5+6+7+8+9+10=55

samlife

総合スコア45

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2018/08/13 19:52

久々にプログラミング学習をしようと、pythonに挑戦中です。相変わらずまだ初心者です。
言語は関係のない話にはなりますが

連続する数字の和

例:1+2+3+4+5+6+7+8+9+10=55

これをプログラミングで表現したいとなると、自分なりに考えてみたのは、配列に全部ぶちこんで、sum関数というやつで足すというものでした。

Python

1#配列に全部入れて、すべてを足す sum()関数を使う 2x = [] 3n = 0 4while n != 10: 5 n += 1 6 x.append(n) 7 8#print(type(x)) 9print(x) 10print(sum(x))

関数を使わず、普通の演算子のみで表現したいと思った場合、どんな方法があるでしょうか。

(10+11)*0.5 (mathwords.netより)

といった法則はあるようですが、そういったものは使わず、質素なプログラミングのみの方法でお願いします。

自分ももう少し考えてみます。

DrqYuto👍を押しています

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

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

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

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

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

mitsu-wan

2018/08/19 14:34 編集

質問では入力例が1~10になってますが、別に等差数列限定ってわけでもないんですかね?
guest

回答11

0

Pythonなど不要。そう、シャル芸ならね!

bash

1$ seq 10 21 32 43 54 65 76 87 98 109 1110 12$ seq 10|xargs|tr ' ' '+'|bc 1355

投稿2018/08/13 20:57

hichon

総合スコア5737

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

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

satocha

2018/08/13 23:29

powershellなら iex((1..10)-join"+")
guest

0

こんにちは。
ご質問に、

言語は関係のない話にはなりますが

とあったので、使うプログラミング言語が何かによらず適用できる考え方をご質問されているものと思いました。ですので、1から10までを(リストや配列を使ったり、whileループを使ったりして、)列挙して足しあげるのではない、別の考え方を以下に挙げます。

【考え方】

n を自然数として、1から n までの自然数の和を S(n) とすると、以下が成り立つ。
S(1) = 1

S(n) = n + S(n-1) ( ただし、n > 1)

これをプログラムで書くと、再帰呼び出し(recursive call)をする関数を使うことになります。
ご質問には、

関数を使わず、

とありますが、これは「言語に標準で用意されている、sumのような関数を使わず、」という意味で、関数を新たに定義することは問題ないでしょうか? 問題ないのであれば一例として以下のようになります。

Python

1def sum_from1to(n): 2 if n == 1: 3 return 1 4 return n + sum_from1to(n - 1) 5 6 7print(sum_from1to(10)) # => 55

また、上記が

言語は関係のない話

であることを示すために、sum_from1toを別の言語で書いてみると、例えば Lisp なら以下になります。

Lisp

1(define (sum_from1to n) 2 (if (= n 1) 3 1 4 (+ n (sum_from1to (- n 1))))) 5

  
以上、参考になれば幸いです。


追記

なお、実際に再帰関数を用いたプログラムを書く際には、再帰の回数に適切な上限を設ける必要があります。たとえば、上記のsum_from1tosum_from1to(0)と呼ぶと、永遠に再帰呼び出しをすることになり、どこかでスタックオーバーフローを起こして異常終了します。ですが、この回答では「再帰で求める」という考え方自体を示すことが主たる目的なので、(つまり、回答中にあるPythonやLispによるコードよりも、**【考え方】**に書いた漸化式のほうが主なので、)あえてスタックオーバーフロー対策のコード追加はしていません。

投稿2018/08/13 23:20

編集2018/08/15 10:33
jun68ykt

総合スコア9058

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

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

tachikoma

2018/08/13 23:52 編集

再帰呼び出しの回数上限に引っかからない範囲なら。
jun68ykt

2018/08/14 01:42

コメントありがとうございます。回答に追記しました。
guest

0

自分が手計算するときはこうやってるかも。

python

1m = 10 2n = 1 3ans = 0 4while n < m 5 #両端から足す。(1+10,2+9,...,5+6) 6 ans += n + m 7 n += 1 8 m -= 1 9 10#奇数のときは中央値を最後に足す。(今回は10なので素通り) 11if n == m 12 ans += n 13 14print(ans)

コードで書くとちょっと変か。。。

投稿2018/08/14 06:31

編集2018/08/14 08:21
yukihisa

総合スコア672

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

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

退会済みユーザー

退会済みユーザー

2018/08/14 07:00

公式はダメって書いてある。
yukihisa

2018/08/14 07:08 編集

公式はn*(n+1)/2では? もしくはn*(a+l)/2ではありますが、違いますよね?
退会済みユーザー

退会済みユーザー

2018/08/14 07:11

ガウス知らんのか。公式と同じ法則を使ってるだろ。質問者が「法則は使わず」って言ってんだから守れよ。
yukihisa

2018/08/14 07:49 編集

ガウスの法則はもちろん知っていますよ? 質問者様の意図は「関数やこういった法則は使わず」ですよね? 初心者の自分が処理の中で理解できないような物を使わず、質素なプログラミングのみの方法で自分なりに作るとしたらどうしよう、というのが質問内容だと理解したのですが。 range関数ならいいかな、とか法則をコードで自分なりに分かりやすく書いたらどうかな?とか自作の関数作ってみたら?とか、すでにある公式でなく、自分なりにどうするかを聞かれているので問題ないと思いますよ?
LouiS0616

2018/08/14 07:51

ガウスの方法がO(1)なのに対して、yukihisaさんの解法はO(n)です。 発想の源が同じだとしても、この回答をガウスの方法とみなすのは無理があるように思います。 むしろ、 n+m の値が常に同じであることに自然に気付ける、示唆に富んだ良い回答に見えます。+1
yukihisa

2018/08/14 08:08

Louis0616 様 意図を汲み取っていただき、ありがとうございます。 初心者でも理解でき、なおかつできる限りループを少なく、そして公式を理解する一歩になればいいかな、と思ったのです。 法則は使いたくない、と質問者様は質問で記述していますが、個人的にプログラミングとは物事の法則を考えてコードに落としていく行為だと思うのです。といいながらも正直「なるものはなる!」と理解せずに使用している関数や公式は数多くありますが、できる限り理解できるように勉強して使っていきたいものですね。
yukihisa

2018/08/15 03:03

kyoko何某 殿 なりすましは非常に困ります。 低評価を付けるのは別に構いませんが、私の名前とアイコンを無断転用するようなことはおやめください。 私だけでなく、他の有意義な回答を探している皆様に非常に迷惑です。
guest

0

なんか絶対に違うこれ、みたいなものを書いてみました。

python

1x = list(range(1,11)) 2y = ['|'*i for i in x] 3z = ''.join(y) 4 5print(len(z))

投稿2018/08/13 21:49

mkgrei

総合スコア8560

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

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

0

みなさん難しく考え過ぎですよ。

python3

1sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10

ベストアンサーはいただきました。

投稿2018/08/13 21:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tacsheaven

2018/08/13 23:45

質問の意図を全く無視した、無駄な回答
退会済みユーザー

退会済みユーザー

2018/08/14 06:54 編集

「関数を使わず、普通の演算子のみで表現」だから間違ってはいない。
satocha

2018/08/14 09:26

高評価する人は空気読んでない 低評価する人は空気読めてない 以上:-)
退会済みユーザー

退会済みユーザー

2018/08/14 09:39 編集

誰がどんな評価をつけようが自由だろ。みんな同じ意見じゃないとダメか?
退会済みユーザー

退会済みユーザー

2019/06/03 05:08

別に退会せんでもええのに・・・
guest

0

「配列に全部ぶちこむ」のは、手間が一つ余計でしょう。メモリも無駄に占有することになると思います。

whileループを回すまで思いついたなら、

n=0 s=0 while n != 10: n += 1 s += n print(s)

しかし、whileではなくforを使うのが素直だと思います。rangeは関数だからダメという話でなければですが。

for n in range(1,11): s += n print(s)

ちなみにsumを使っていいのだったら、次のコードでできそうです。

print(sum(range(1,11)))

投稿2018/08/13 20:54

KojiDoi

総合スコア13671

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

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

0

整数の等差数列ならrangeを使えばいいかも。

Python

1a = sum(i for i in range(1, 11)) 2print(a)

別解?

Python

1def myadd(n): 2 return n + myadd(n-1) if n else 0 3print(myadd(10))

メモリー効率がこの上なく悪いうえに、手元の環境では2968までしか計算できませんでしたが、お遊びということで。

投稿2018/08/13 20:39

編集2018/08/14 01:59
tachikoma

総合スコア3601

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

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

wakame

2018/08/14 01:51

a = sum(i for i in range(1, 11))←括弧閉じられてないです
guest

0

多くの方から低評価がありましたので、こちらの回答は削除させていただきます。

投稿2018/08/13 21:16

編集2018/08/14 08:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

LouiS0616

2018/08/14 05:24

質問本文で公式を使わないことに言及がある他、 minやmaxなどと言った命名はシャドウイングを招きお行儀が悪いです。
退会済みユーザー

退会済みユーザー

2018/08/14 05:39

>質問本文で公式を使わないことに言及がある きちんと読んでませんでした。 でも、関数も法則も利用したちゃだめだと難しいですね。 > minやmaxなどと言った命名はシャドウイングを招きお行儀が悪いです。 すみません、直しておきます。
退会済みユーザー

退会済みユーザー

2018/08/14 06:56

質問読めよ。
退会済みユーザー

退会済みユーザー

2018/08/14 08:27

コードは削除しました。 関数も法則も使わずとなると for 文や while 文を使った単純な計算式しか浮かびませんね。
guest

0

配列にいれる操作を、足し算にすればよいです。
そろばんの読み上げ算でやるように最初に "ねがいましては.." (0 にする) をする必要があります。

python

1ans = 0 2n = 0 3while n != 10: 4 n += 1 5 ans += n 6 7print(ans)

投稿2018/08/13 22:45

katoy

総合スコア22324

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

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

0

rubyでしたら、

p [*1..10].sum #=>55

投稿2019/05/27 13:37

DrqYuto

総合スコア432

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

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

0

多くの言語に存在するforそのままじゃんと思ったので

javascript

1function 等差加算(初期値,最大値,加算値) { 2 var 戻り値 = 0; 3 for(var i=初期値; i<=最大値; i+=加算値) { 4 戻り値+=i; 5 } 6 return 戻り値; 7} 8console.log(等差加算(1,10,1));

投稿2018/08/14 06:53

efcode

総合スコア422

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問