• 締切済み

C言語でシグマで総和を求める関数を作りたい

おかしな点がありましたらご指摘お願いします /* nの総和を求める関数 */ int sum(int n) { /*     n-1      */ /* f(n) + Σ f(i)  (n > 1) */ /*     i=1      */ /* f(1)      (n = 1) */ if (n > 1)  return n + (n - 1) * (n / 2); /* 直接総和を返す*/ else if (n == 1)  return 1; }

みんなの回答

回答No.8

 Σ(シグマ)で総和を求める関数を作りたい? return n + (n - 1) * (n / 2);  /* 直接総和を返す */     ↓   (n^2 + n) / 2 ですよね? 思わず笑わせていただきました。 if は必要ないですよ。 どうしても使いたいという場合は、「ながら」あなたの解答で良いんじゃないでしょうか。 /* txz.c Σf(n) test program * execution: ./txz 5 * compile:  gcc txz.c -o txz */ #include <stdio.h>   /* for printf() */ #include <stdlib.h>   /* for atoi() */ int f(int); int main(int argc, char *argv[]) {  int temp;  temp = atoi(argv[--argc]);  printf("f(%d) = %d\n", temp, f(temp));  return 0; } int f(int n) {  // if (n <= 1)  // return 1;  // else   return n + (n - 1) * n / 2; }

全文を見る
すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

(全くの憶測で、ハズシているとは思いますが、もしやってことも・・無いか?) >>「n の総和を求める」という日本語の意味が分かりません.  >これは無視してください自分でも説明出来ないので 「無視」して、かつ、質問者様が課題?を理解していない、または、課題を正しく質問文にできなかった(失礼)と仮定して・・。 >コメント内の関数を作りたいのですが・・・  コメントの外を含めて int sum() という関数を作り直してみました(分離独立?して関数 f() も)。 ・関数 sum() で、n を 1 から 5 までとして、関数 f( n ) を呼び出し、その戻り値を積算(◆)するものを作ってみました。 ☆nが5のとき(机上計算で)結果はいくつになるのが正解?でしょうか?。下では32となります。 #include <stdio.h> int f( int iVal ) {  if( iVal == 1 ) return( 1 ); // 「たまたま」機能的には、次の行でOK  return( iVal + ( iVal - 1 ) * ( iVal / 2 ) ); } int sum( int iOwari ) {  int n, iSum = 0; // 「和」を求める場合に必要な初期化  for( n = 1; n <= iOwari; n++ ){   iSum += f( n ); // ◆  }  return( iSum ); } void main() {  printf( "f(%d) 総和 = %d\n", 5, sum( 5 ) ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

全文を見る
すると、全ての回答が全文表示されます。
回答No.6

>いやいや、fとΣで示されたコメント内の定義を忠実に実装するなら う~~ん、そうなんですけどねえ(笑)。 ただ、コメントのタイトルには >/* nの総和を求める関数 */ って書いてある(笑)。 f(n)の総和を求めるのとnの総和を求めるんじゃ偉い違いです(苦笑)。 前者だと、確かに高階関数辺り使わないとメンド臭いんですよね(笑)。 Cだと関数ポインタかよ(笑)。ANSI Common Lispなんかじゃ鼻クソホジってる間に記述できるんですが。

全文を見る
すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.5

いやいや、fとΣで示されたコメント内の定義を忠実に実装するなら int sum(int n, int (*f)(int)) { if (n>1) { return f(n) + sum(n-1, f); } else if (n==1) { return f(1); } else { return 0; } } でしょう。 返り値の型は勝手にintとしました。 nが0以下の場合は定義が与えられていないので、これも勝手に0としました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

あるいは、単に再帰したいだけか。 /* ここから */ int sum(int n) { if (n == 1) { return 1; } else { return n + sum(n - 1); } } /* ここまで */

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

1~nまでの総和を求める関数の場合  nの値が偶数のときは    (1+n)*(n/2)  で合計が計算できます。しかし、nの値が奇数のときは上手くいきません。あたなのプログラムの    n + (n - 1) * (n / 2); の部分はこの式を勘違いしたのでしょうか? ちなみに1~5までの和を求めるプログラムの一部を示しますので、参考にしてください。 int sum=0; for(int i=1;i<=5;i++){ sum+=i; } printf("%d\n",sum);

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>コメントの関数を計算したいのです コメントに書かれているfという関数は、 どういう機能を持っているのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「n の総和を求める」という日本語の意味が分かりません. コメントを見る限り「f(1)~f(n) の総和を求める」ということでしょうか? もしそうなら, あなたが書いた関数の中で f を全く呼び出していないのはなぜでしょうか? あるいは「1~n の総和を求める」であったとしても, あなたの書いた関数は正しくありません.

meo
質問者

お礼

>>「n の総和を求める」という日本語の意味が分かりません. これは無視してください 自分でも説明出来ないので >>コメントを見る限り「f(1)~f(n) の総和を求める」ということでしょうか? コメントの関数を計算したいのです >>あなたの書いた関数は正しくありません. どうすればいいのでしょう? コメント内の関数を作りたいのですが・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 再起になってますか?[C++]

    再起を使って総和のプログラムをつくったのですが、ちゃんと再起に なってるのか自信がないので教えてください。 これはほんの一部のコードなんですが computeRecursiveSum()の中のreturn( computeSum() ); の部分があってるのかわかりません。 本やそこらのサイトをみてみるとこの部分は、 return(n+Sum(n-1)); という風になっているのですが 下のような書き方してもよろしいのでしょうか? 一応、正しい答えはでます。 int Summation::computeSum() const{   int a=0;   for (int i=0; i<=number; i++){     a = i*(i+1)/2;   }   return a; } int Summation::computeRecursiveSum() const {   int n = number;   if ( n < 0 )     return (-1);   else if ( n = 0 )     return (0);   else     return( computeSum() ); }

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

  • C言語

    forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。 #include<stdio.h> int main(void) { char moji; int i,sum; printf("正の整数を1から順に加算します。n\"); printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n"); moji=getchar(); if(moji==y) { for(i=2;sum>=1001;i++) { この部分がわかりません; printf("加算値は%dです。¥n",sum); } }else if(moji=='n'){ printf("終了します。\n"); }else{ printf("YまたはNを入力してください。\n"); } return 0; }

  • 困ってます…nCrを求めるC言語プログラミング

    nCr、つまりn個のうちr個を取り出すときの場合の数を求めるプログラミングを作りたいのですが、どうもうまくいきません。 関数combinationを作って求めるという指定もあり、自分で出来るとこまで作ってみたのですが訳がわからなくなってしまい、かなり困っています…; コンパイルは出来るのですが実行してもセグメントエラーが出るばかりで… すみませんがご指摘していただけないでしょうか…? #include<stdio.h> //階乗を計算する関数 int fact(int num){ int i; if(num < 0){ return -1; } else if(num == 0){ return 1; } else if(num == 1){ return 1; } else { i = num * fact(num - 1); return i; } } //コンビネーションを計算 int combination(int n, int r) { int fact(int num); int i; i=fact(n)/fact(r)/fact(n-r); return combination(n-1, r-1)-combination(n,r-1); } int main(void) { int n, r; while ( printf("n r を入力して下さい。"), scanf("%d%d", &n, &r) == 2 ) { printf("nCr(%d,%d)=%d\n", n, r, combination(n, r)); } return 0; }

  • C言語に詳しい方、教えていただけませんか?

    n個の実数をキーボードから入力して総和を求めるプログラムを書いたのですが、結果が+NANとなってしまいます。 また、値をキーボードから入力する際、小数にするとすぐにプログラムが終了してしまいます。例えば、a[0]=1.0とすると、 a[1]=a[2]=a[3]=a[4]=合計は+NANと表示され終了してしまいます。 ちゃんと小数を入力でき、結果も正しく表示されるように間違いを指摘していただけませんか?よろしくお願いします。 (nは5としました) #include <stdio.h> #define n 5 double souwa(double a[n]); int main(void) { int i; double sum, a[n]; for(i=0; i<=n-1; i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); } sum = souwa(a); printf("合計は%f\n",sum); return 0; } double souwa(double a[n]) { int i; double sum = 0.0; for(i=0; i<=n-1; i++){ sum += a[i]; } return sum; }

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • 因数分解プログラム(C言語)について(3)

    つづきです /*求めた最大公約数で約分*/ if(*flag == 1){ *d = *m1 / *i; *e = *n1 / *i; } else{ printf("約分できません。\n"); *d = *m1; *e = *n1; } return 0; } int yakubun2(int *m2,int *n2,int *min2,int *flag,int *i,int *f,int *g) { /*最大公約数を見つける*/ if(*m2 < *n2){ *min2 = *m2; } else{ *min2 = *n2; } *flag = 0; for(*i = min2; *i > 0; *i--){ if(*m2 % *i == 0){ if(*n2 % *i == 0){ *flag = 1; break; } } } /*求めた最大公約数で約分*/ if(*flag == 1){ *f = *m2 / *i; *g = *n2 / *i; } else{ printf("約分できません。\n"); *f = *m2; *g = *n2; } return 0; } /*因数分解の結果を表示*/ int output(int *d,int *e,int *f,int *g) { printf("(%dχ-%d)(%dχ-%d)",*d,*e,*f,*g); return 0; } 関連URL:http://www.okweb.ne.jp/kotaeru.php3?q=474597

  • c言語の再帰で(関数呼び出し)+1がわからない

    再帰がどのように処理されているのか理解するために、再帰の時に +1 してみたところ 0! = 1 1! = 2 2! = 5 3! = 16 4! = 65 5! = 326 6! = 1957 7! = 13700 8! = 109601 9! = 986410 10! = 9864101 となりました。 普通の階乗の値を求めた最後に +1され、それが戻されると思ったのですが違いました。 これはどういう処理がされているのでしょうか? #include <stdio.h> int kaijo(int); int main() { int i; for (i = 0; i < 11; i++) printf("%d! = %d\n", i, kaijo(i)); return 0; } int kaijo(int n) { if (n == 0) return 1; else return n * kaijo(n - 1) + 1; }

  • C言語のソースコードについて教えてください。

    以下のソースコードを学習用C言語開発環境で行ったのですが、 『ファイル「C:/Users/ユーザー名/AppData/Local/EasyIDEC/project/タイトル/main.c」の 「41行目」で記述エラーを発見しました。 「,」を付け忘れています。』 という、コンパイルエラーが表示されました。 何度も見直したのですが、よくわかりません。 #include <stdio.h> int main(int argc, char *argv[]) { char answer ; answer = 'n' ; while(answer =='n') { int input ; input = 0 ; int add ; add = 1 ; int sum ; sum = 0 ; printf("数値を入力して下さい。:") ; scanf("%d", &input ) ; int i ; i = 0 ; while(i < input) { sum =sum + add ; printf("\n%d",sum) ; i++ ; add++ ; } printf("\n1から%dまでの総和は、%dです。" , input , sum) ; while(1) { printf("\n終了しますか? y/n:") ; scanf(" %c , &answer) ; if( (answer != 'y') && (answer != 'n') ) { printf( "y or nを入れてください。") ; } else { break ; } } } return 0 ; }

  • C言語 繰り返しの問題

    C言語の初心者です。 キーボードから値を入力して、1から入力された値までの奇数の和を求めて出力するプログラムを作成します。以下のように組んでみましたが、全然うまくいきません。誰か教えていただけませんか? #include<stdio.h> int main(void) { int i,n,sum; sum=0; printf("入力値:",n); scanf("%d",&n); if(n<=0) { printf("\n合計値:0\n"); } else { printf("入力値:\n",n); for(i= 1; i<= n; i=i+2) { if(n%2=1) { sum=sum+i; } } } printf("\n合計値\n",sum); }