fork download
  1. #include <stdio.h>
  2.  
  3. /* フィボナッチ数を求める関数(F₀ = F₁ = 1) */
  4. double fib(int n) {
  5. if (n <= 1) return 1.0;
  6.  
  7. double f0 = 1.0, f1 = 1.0, f;
  8. for (int i = 2; i <= n; i++) {
  9. f = f0 + f1;
  10. f0 = f1;
  11. f1 = f;
  12. }
  13. return f1;
  14. }
  15.  
  16. /* n^k を求める関数(再帰やpowなしで実装) */
  17. double power_nk(int n, int k) {
  18. double result = 1.0;
  19. for (int i = 0; i < k; i++) {
  20. result *= n;
  21. }
  22. return result;
  23. }
  24.  
  25. /* 絶対値を求める関数(fabs を使わずに)*/
  26. double my_abs(double x) {
  27. return (x < 0) ? -x : x;
  28. }
  29.  
  30. /* メイン関数 */
  31. int main(void) {
  32. int k;
  33.  
  34. printf("整数 k を入力してください: ");
  35. scanf("%d", &k);
  36.  
  37. int best_n = 1;
  38. double best_diff = my_abs(fib(1) - power_nk(1, k));
  39.  
  40. for (int n = 2; n <= 100; n++) {
  41. double f = fib(n);
  42. double p = power_nk(n, k);
  43. double diff = my_abs(f - p);
  44.  
  45. if (diff < best_diff) {
  46. best_diff = diff;
  47. best_n = n;
  48. }
  49. }
  50.  
  51. printf("\n--- 結果 ---\n");
  52. printf("差 |F_n - n^k| が最小になる n = %d\n", best_n);
  53. printf("F_%d = %.0f\n", best_n, fib(best_n));
  54. printf("%d^%d = %.0f\n", best_n, k, power_nk(best_n, k));
  55. printf("差 = %.0f\n", best_diff);
  56.  
  57. return 0;
  58. }
Success #stdin #stdout 0.01s 5308KB
stdin
Standard input is empty
stdout
整数 k を入力してください: 
--- 結果 ---
差 |F_n - n^k| が最小になる n = 1
F_1  = 1
1^21947 = 1
差     = 0