2 条题解

  • 2
    @ 2023-1-2 16:01:03

    这个程序利用公式a[n]=a[1]+a[2]+...a[n/2]+1,代码较短,时间可能稍长一点。要缩短时间算至a[n/2]就可以直接算a[n]了

    AC代码

    #include <iostream>
    using namespace std;
    int main()
    {
        int a[1001], n, i;//输入n输出a[n]
        a[1] = 1;//相当于结尾+1 
        cin >> n;
        for (i = 2; i <= n; i++)//依次从a[2]算到a[n] 
        {
            a[i] = 1;
            for (int j = 1; j <= i / 2; j++)//算出a[i]的值 
                a[i] += a[j];
        }
        cout << a[i - 1];//减去i多加的1
        return 0;
    }
    
    • -1
      @ 2022-10-28 9:58:37

      实际上,这道题非常简单,只要把题目读清楚就行了。 我们不需要把每一个添加过后的数算出来,只需要把添加到左边的数求出来就可以了。每一次,n都会在原数前面添加新数(不超过原数一半),不知道会重复多少次,此时可以用简单的递归做出来。 不懂?代码放出来得了。

      ``

      /*
      实际我们不需要直接将数添加在原数左边
       我们只需要把添加的数算出即可
      */
      void add(int n)  //向左边添加数字的函数
      {
          ans++;  //每次结果都是一个合法的数字,ans加1
          //判断能不能继续加,因为1整除2得0,不能继续添加
          if (n == 1)
              return;  //停止递归
          //遍历每一个能够添加的数
          for (int i = 1; i <= n / 2; i++)
              add(i);  //继续将i赋值于n递归
      }
      
      scanf("%d", &n);
      add(n);  //输入输出后一个函数就解决了
      printf("%d", ans);
      return 0;
      

      *tip:抄答案是不可能滴,你还得老老实实敲代码唷~~

    • 1

    [普及][NOIP2001 普及组] 数的计算

    信息

    ID
    1740
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    133
    已通过
    60
    上传者