2 の倍数でも 3 の倍数でもないものの和を求めたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jun

2 の倍数でも 3 の倍数でもないものの和を求めたい

#1

投稿記事 by jun » 1年前

正の整数 n を引数とし,n 以下の正の整数のうち,2 の倍数でも 3 の倍数でもないものの和を戻り値とする関数 int sum_n( int n ) を作成せよ.

main 関数において整数 a,b をキーボードから受け取り 関数 sum_n を用いて a 以上 b 未満の数のうち, 2の倍数でも3の倍数でもないものの和を求めて表示するプログラムを作成せよ.

↑の問題についてなのですが例えば1と6を入力したとき1~5までの2 の倍数でも 3 の倍数でもない数のみ足し合わせるので答えは1+5で6となるはずなのですが7となってしまい合いません。どこで間違えているのかわからずお力を借りたいです。
↓が作ったコードになります。

コード:

#include<stdio.h>

int sum_n(int n);

int main(void)
{
	int a,b,sum=0,j;
	
	printf("整数を入力してください>>>");
	scanf("%d %d",&a,&b);
	
	for(j=a;j<b;j++)
	{
		if(j%2 != 0 && j%3 != 0)
		{
			sum=sum+sum_n(j);
		}
	}
	
	printf("結果は%d",sum);
	
	return 0;
	
}

int sum_n(int n)
{
	int i,result=0;

	for(i=0;i<=n;i++)
	{
		if(i%2 != 0 && i%3 != 0)
		{
			result=result+i;
		}
	}
	return result;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 2 の倍数でも 3 の倍数でもないものの和を求めたい

#2

投稿記事 by みけCAT » 1年前

sum_n関数は「0~nの整数のうち、2でも3でも割り切れないものの和」を求める関数なので、
今のmain関数の処理だと「sum_n(1)+sum_n(5)」すなわち「1+(1+5)」を求めてしまいます。

sum_n関数を、累積和の値を求める関数として処理を行います。
累積和とは(超初心者用) - Qiita
今回は「a 以上 b 未満の数のうち」で求めたいので、
「b未満の数における計算結果のうち、a未満の数における計算結果を除いたもの」
すなわち「sum_n(b-1) - sum_n(a-1)」の値を求めればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 2 の倍数でも 3 の倍数でもないものの和を求めたい

#3

投稿記事 by みけCAT » 1年前

「a, bは正」や「a ≦ b」といった条件が無いので、これらを満たさない入力の処理にもう少し工夫が必要そうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 2 の倍数でも 3 の倍数でもないものの和を求めたい

#4

投稿記事 by usao » 1年前

実装する前に,「どうすれば良いのか?」というのを日本語で具体的に説明してください(説明できる状態まで考えてください).
これは算数の話なので,プログラミングとは無関係です.
で,それができたら,その話をその通りに実装してください.
おわり.

…っていうだけの話になるかと.


例えば,話を少しだけ単純にして,
「N以下の正の整数の総和を求む関数 F(N) があるとき, 2つの正の整数a,b(ただし a<b)に関して,a以上b未満の正の整数の総和を求む関数 G(a,b) を F() を用いて書け」
とかいう話だったらどうですか?

F(b) は b以下の総和.
F(a) は a以下の総和.
そしたら例えば F(b) - F(a) は何になるのか? と考えると,「(a-1)以上b以下の総和」となるだろう.
欲しい物にだいぶ近いね.
ちょっとだけ修正すれば目的の関数 G() を作れそうではないか.

みたいな.


あなたのmain関数にはループが書かれているけど,やるべきことを日本語で書いたときに「ループする」とかいう話は出てこないんじゃない?
出てこないのであれば,コードに謎ループを書いている時点でもう何かが間違っているんじゃない?

box
記事: 2002
登録日時: 13年前

Re: 2 の倍数でも 3 の倍数でもないものの和を求めたい

#5

投稿記事 by box » 1年前

何で同じことをmainでもsum_nでもやるかな?

コード:

#include <stdio.h>

int sum_n(int n)
{
    int sum, i;

    for (sum = 0, i = 1; i <= n; i++) {
        if ((i % 2 != 0) && (i % 3 != 0)) sum += i;
    }
    return sum;
}

int main(void)
{
    int a, b;

    do {
        printf("a="), scanf("%d", &a);
        printf("b="), scanf("%d", &b);
    } while (!(a <= b));
    printf("answer=%d\n", sum_n(b - 1) - sum_n(a - 1));
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る