C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でKで割った余りがRになる自然数(N以下)の合計を求める方法

問題概要

この問題では、3つの数 NKR が与えられます。求めるのは、「N以下の自然数のうち、Kで割った余りがRになる数」の合計です。

具体的には、i % K == R という条件を満たすN以下の数をすべて足し合わせます。

例で理解しよう

入力:

N = 14, K = 4, R = 1

出力:

28

説明: N以下の数のうち、4で割ると1余る数は 1, 5, 9, 13 です。これらを合計すると 1 + 5 + 9 + 13 = 28 となります。

解法のアプローチ

この問題を解くには、R から N まで、K ずつ増加させながらループします。こうすることで、条件を満たす数だけを効率的に取り出し、順に合計へ加算できます。

1ずつ増加させる通常のループでも同じ結果は得られますが、K ずつ増加させるこの方法はループの回数が大幅に減るため、実行時間の短縮につながります。

C++での実装例

解法を示すプログラムは以下の通りです。

#include <iostream>
using namespace std;
int CalcSumofRem(int N, int K, int R){
    int sum = 0;
    for (int i = R; i <= N; i += K) {
        if (i % K == R)
            sum += i;
    }
    return sum;
}
int main(){
    int N = 14, K = 4, R = 1;
    cout<<"Sum of natural numbers (up to "<<N<<") whose modulo with "<<K<<" yields "<<R<<" is "<<CalcSumofRem(N, K, R);
    return 0;
}

出力

Sum of natural numbers (up to 14) whose modulo with 4 yields 1 is 28

このように、ループの開始値を R に設定し、増分を K にすることで、余りの条件チェックを最小限にしながら目的の合計を効率よく求めることができます。

  1. C++でXとの合計がフィボナッチ数になるノードを数える方法

    各ノードに数値の重みが割り当てられた二分木が与えられます。この記事の目的は、「ノードの重み + X」の計算結果がフィボナッチ数となるノードの個数を求めることです。フィボナッチ数列とは、0, 1, 1, 2, 3, 5, 8, 13… のように続く数列で、n番目の数は(n−1)番目と(n−2)番目の数の和になります。たとえば重みが13であればフィボナッチ数に該当するため、そのノードはカウント対象となります。入力例1temp = 1 の場合。値を入力すると、以下のような木が構成されます。出力Count the nodes whose sum with X is a Fibonacci number

  2. 自然数の合計を計算するC++プログラム:forループと公式の2つの方法を解説

    自然数とは、1から始まる正の整数のことです。自然数の列は以下のように続きます。1, 2, 3, 4, 5, 6, 7, 8, 9, 10……最初のn個の自然数の合計は、forループを使う方法と、数学の公式を使う方法の2通りで求めることができます。それぞれの方法によるプログラムを以下に示します。forループを使って自然数の合計を求めるforループを使用してn個の自然数の合計を計算するプログラムは次のとおりです。サンプルコード#include<iostream> using namespace std; int main() { int n=5, sum=0, i; f