数値シーケンス配列を2つ作成し、それらを断続的にリンクする方法は? (しゃっくり)

数値シーケンス配列を2つ作成し、それらを断続的にリンクする方法は? (しゃっくり)

私は次のような挑戦を受けました:

Examine the series of numbers shown below:
        2 1 4 3 8 5 16 7 32 9 64 ...
2 is the 1st number in the series, 1 is the 2nd number in the series, etc.
Using Bash, create a program that finds the sum of the first 10,000 numbers.
Submit the first 10 digits of the sum as your answer.
(Answer: 2824934064)

この問題を解決する方法は、シリーズを2つに分け、各シリーズごとにforループを作成し、マージしたい場所で新しい配列を作成することだと思います。

最初のシーケンスは次のとおりです。

1. 数字 2 から始まり、10,000 個の数字に達するまで倍増する配列を作成します。

二つ目は

2. 数字 1 から始まり、10,000 個の数字に達するまで 2 を追加して配列を作成します。

次に、次を含む3番目の配列があります。

3. 2つの配列を結合しましたが、これは{value1FromArray1、value1FromArray2、value2FromArray1、value2FromArray2...}と同じです。

今私が考えている唯一のことは...私の方法は仕事をするようですが、非常に非効率的です。 forループやwhileループに関連するより簡単な方法があると思います。どんな提案がありますか?まだ何も試していません。

ベストアンサー1

合計を提供するのではなく、答えを提供します。

乗算系列に比べて加算系列はサイズが小さいので無視しても構いません。忘れて。

前述のように、乗算には最初の10桁の数字のみが使用されます。乗数は2なので、結果の長さは1桁以上増加しません。キャリーの精度を維持するのに十分な長さを維持しながら、bash結果を数学の快適な範囲内に保ちます。

s=2; for ((i=1; i<=5000; i++)); do s=$((2*s)); s=${s:0:15}; done; echo ${s:0:10}

2824934064

@rastafileの幾何学的なシリーズのキャリー処理は私の心を捕らえたので、純粋な盗作であることを認めますが、より直感的であると思われる別のバージョンがあります。

sum=2; carry=0; rgstr=
for ((i=1;i<=5000;i++)); do
  #calculate from right to left over the string in sum
  for (( j=${#sum}-1; j>=0; j-- )); do
    #get the digit
    x=${sum:$j:1}
    #double the digit and add the current carry
    x=$((x * 2 + carry))
    #get the new carry
    carry=$((${#x}-1))
    #compose the intermediate string
    #carry naturally indexes to the rightmost digit in x
    rgstr=${x:$carry:1}$rgstr
  done
  #deal with any remaining carry before going round again
  if [ $carry -eq 1 ]; then rgstr=$carry$rgstr; carry=0; fi
  #load the sum from the register and then zero it 
  sum=$rgstr
  rgstr=
  (( $i % 100 == 0 )) && echo "$i iterations, sum is ${#sum} digits long"
done
echo "First ten digits of sum are ${sum:0:10}"

おすすめ記事