C 程序 - 赛格故障,原因



当我输入 6 (int) 作为值时,运行它会给我一个 seg 错误(gcc 文件名.c -lm)。请帮我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经进入了 seg 错误。

谢谢!

#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("%sn", s[n-1]); 
  else
    {
      tmp = n;
      for (i = 1;;)
    {
      tmp = tmp - (l * pow(2,i-1));
      if (tmp <= 5) 
        {
          // printf("Breakingn");
          break;
        }
      ++i;
    }
      printf("Last index = %dn", i);   //  ***NOTE***
      //Value lies in next array, therefore
      ++i;
      index = tmp + pow(2, n-1);
      printf("%dn", index);
    }
  return 0;
}

当你输入 6 表示 ns[n-1] 时,你正在执行越界访问:

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

因为数组中只有 5 个指针。所以只有 0-4 是有效的索引。

您正在使用 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)]

我希望这有所帮助。

相关内容

  • 没有找到相关文章

最新更新