杭电1005 Number Sequence

A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).
作为小编我也很无语啊,我也是服了,用了这么多方法,要不就是内存,要么就是超时
递归_内存超了

using namespace std;
int f(int A, int B, int n)
{ if (n == 1)
  return 1;
 else if (n == 2)
  return 1;
 else
  return (A * f(A, B, n - 1) + B * f(A, B, n - 2)) % 7;
}
void main()
{
 int A, B, n;
 for (;;)
 {
  cin >> A >> B >> n;
  if (A >= 1 && A <= 1000 && B >= 1 && B <= 1000 && n >= 1 && n <= 100000000)
   cout << f(A, B, n) << endl;
  else if (A == B == n == 0)
    break;
 }
}

数组_超时

#include<iostream>
using namespace std;
void main2()
{
 int a, b, n, m,i, arr[48];
 while (cin >> a && cin >> b && cin >> n)
 {
  if (a >= 1 && a <= 1000 && b >= 1 && b <= 1000 && n >= 1 && n <= 100000000)
  {
   m = n;
   arr[1] = 1;
   arr[2] = 1;
   for (i = 3; i < 48; i++)
    arr[i] = ((a * arr[i - 1] + b * arr[i - 2]) % 7);
   cout << arr[m] << endl;
  }
  else if (a == b == n == 0)
   break;
 }
}

指针_超内存

#include<iostream>
using namespace std;
int main() {
 int A, B, n;
 while (cin >> A >> B >> n && A != 0) {//由题目给出范围简化判定条件
  int* number = new int[n];
  number[0] = 1;
  number[1] = 1;
  for (int i = 2; i < n; i++) {
   number[i] = A * number[i - 1] + B * number[i - 2];
   number[i] %= 7;
  }
  cout << number[n - 1] << endl;
  delete[]number;
 }
 return 0;
}

最后优化
经过最后的优化,也不知道为什么把数组放到函数里进行调用,而放在main里面就进行不了
f(n)最多7*7=49种值,所以每给一次A,B都只要算前49个数,用f(n)等于前49个中的一个

using namespace std;
int f(int a, int b, int n);
int main()
{
 int a, b, n;
 while (cin >> a >> b >> n)
 {
  if (a == 0 && b == 0 && n == 0)
   break;
  cout << f(a, b, n) << endl;
 }
 return 0;
}
int f(int a, int b, int n)
{
 int arr[50];
 arr[1] = arr[2] = 1;
 for (int i = 3; i < 50; i++)
 {
  arr[i] = (a * arr[i - 1] + b * arr[i - 2]) % 7;
 }
 if (n % 49)
  return arr[n % 49];
 else
  return arr[1];
}


发布了50 篇原创文章 · 获赞 75 · 访问量 6698

猜你喜欢

转载自blog.csdn.net/weixin_45822638/article/details/103413023