C言語で前の要素による除算後の配列の合計を求める方法
配列とは、同じデータ型の要素が順番に並んだデータ構造です。この記事では、整数型の配列を扱い、「各要素をその直前の要素で除算した商の合計」を求める方法を解説します。
まず、具体例を見ながら問題の内容を理解しましょう。
例1
配列 : 3 , 5 , 98, 345 合計 : 26
解説 − 3 + 5/3 + 98/5 + 345/98 = 3 + 1 + 19 + 3 = 26
各要素をその直前の要素で除算し、商の整数部分のみを使用して合計を求めています。
例2
配列 : 2, 5 , 8, 11, 43 , 78 , 234 合計 : 13
解説 − 2 + 2 + 1 + 1 + 3 + 1 + 3 = 13
アルゴリズム
このアルゴリズムでは、配列の各要素を先頭から順に走査し、その要素を直前の要素で除算します。そして、得られた商を合計用の変数(sum)に加算していきます。
入力 : 配列 - int arr[] 出力 : int sum
Step 1: sum を arr[0] で初期化する Step 2: i = 1 から配列のサイズまで、Step 3 を繰り返す Step 3: sum = sum + (arr[i] / arr[i-1]) Step 4: sum を出力する
これは「前の数値で除算した後の配列の合計」を求めるための、わずか4ステップのシンプルなアルゴリズムです。合計を配列の最初の要素で初期化しているのは、最初の要素にはそれより前に要素が存在せず、どの要素でも除算できないためです。仮に for ループを i = 0 から開始すると、存在しないインデックス -1 の要素にアクセスすることになり、プログラムが誤動作する恐れがあります。
実装例
#include<stdio.h>
int main() {
int arr[] = { 2, 5 , 8, 11, 43 , 78 , 234 };
int n = sizeof(arr)/sizeof(arr[0]);
int sum = arr[0];
for (int i = 1; i < n; i++) {
sum += arr[i] / arr[i - 1];
}
printf("前の数値で除算した後の配列の合計は %d です \n", sum);
return 0;
}出力
前の数値で除算した後の配列の合計は 13 です。
-
PythonでK回の符号反転後に配列の合計を最大化する
問題概要 整数の配列 A が与えられます。この配列に対して、次の操作をちょうど K 回行うことを考えます。 任意のインデックス i を選び、A[i] を -A[i] に置き換える(符号を反転する) すべての操作を行ったあとの配列の合計として、考えられる最大値を求めるのがこの問題です。 例: A = [4, 2, 3]、K = 1 の場合、出力は 5 になります。インデックス 1 を選んで反転すると配列は [4, -2, 3] となり、合計は 4 + (-2) + 3 = 5 となるからです。 解法の考え方(貪欲法) この問題は貪欲法で解くのが有効です。基本となる発想は次の通りです。 負
-
Pythonでクエリ処理後の偶数の合計を効率的に求める方法
整数の配列 A と、クエリを格納した配列 queries があるとします。i番目のクエリでは、value = queries[i][0]、index = queries[i][1] となり、A[index] に value を加算します。そして、i番目のクエリに対する答えは、更新後の配列 A に含まれる偶数の合計値です。すべてのクエリに対する答えを順番に求め、それらを配列として返すのがこの問題の目的です。問題の例例として、配列が [1,2,3,4]、クエリ配列が [[1,0],[-3,1],[-4,0],[2,3]] の場合を考えてみましょう。このとき、答えの配列は [8,6,2,4] になり