0

これを実行すると、値として6(int)を入力すると、セグメンテーション違反(gcc filename.c -lm)が発生します。これについて頭を悩ませるのを手伝ってください。意図した機能はまだ実装されていませんが、なぜ私がすでにセグメンテーションフォールトに向かっているのかを知る必要があります。

ありがとう!

#include<stdio.h>
#include<math.h>
int main (void)
{
  int l = 5;
  int n, i, tmp, index;
  char * s[] = {"Sheldon", "Leonard", "Penny", "Raj", "Howard"};
  scanf("%d", &n);

  //Solve Sigma(Ai*2^(i-1)) = (n - k)/l     

  if (n/l <= 1)
    printf("%s\n", s[n-1]); 
  else
    {
      tmp = n;
      for (i = 1;;)
    {
      tmp = tmp - (l * pow(2,i-1));
      if (tmp <= 5) 
        {
          // printf("Breaking\n");
          break;
        }
      ++i;
    }
      printf("Last index = %d\n", i);   //  ***NOTE***

      //Value lies in next array, therefore
      ++i;

      index = tmp + pow(2, n-1);
      printf("%d\n", index);

    }
  return 0;
}
4

2 に答える 2

2

とに6を入力するns[n-1]、範囲外のアクセスを実行します。

printf("%s\n", s[n-1]); 

配列には5つのポインタしかないためです。したがって、0〜4のみが有効なインデックスです。

于 2012-12-08T11:01:35.633 に答える
-1

あまり効率的ではないpow関数を使用しています。

これがPythonでの私の解決策です。

from math import ceil

names = ['Sheldon', 'Leonard', 'Penny', 'Rajesh', 'Howard']

n = int(raw_input())

i = 0
j = 1
k = len(names)

while i <= n:
    i += k
    k += k
    j += j

print names[int(ceil((n - (i - k * 0.5)) / (j * 0.5)) - 1)]

これがお役に立てば幸いです。

于 2012-12-08T11:06:23.993 に答える