蓝桥杯--5个砝码

读取输入:程序首先提示用户输入一个整数N,并将其作为参数传递给fama函数。

嵌套循环:在fama函数中,使用五个嵌套的for循环来遍历每组数的所有可能组合。这实际上是尝试所有可能的加法和减法组合,以查看它们是否可以相加或相减得到N

检查和赋值:对于每个组合,如果五个数的和等于N,则将这些数存储在ans数组中。注意,这里有一个问题:如果找到多个解,ans数组只会被最后找到的解覆盖。

输出解:在循环结束后,程序遍历ans数组并输出解。为了简化输出,它只输出非零的数字,并在正数前面加上加号(除了第一个数,除非它是正数)。

然而,这段代码存在一些问题:

只输出一个解:如果有多个解,代码只会输出最后一个找到的解。为了找到所有解,你需要对代码进行一些修改,例如使用vector<vector<int>>来存储所有可能的解。输出格式:输出格式可能不是用户所期望的。例如,如果解是-1 -3 9,代码会输出-1-3+9,而不是-1 -3 +9(注意空格)。

性能问题:对于大的N,五层嵌套循环可能会导致程序运行得非常慢。你可以考虑优化算法来减少不必要的计算。

数组大小:虽然ans数组的大小是5,但代码中只使用了前4个位置(ans[4]没有被使用)。这可能会导致混淆,最好只声明你实际需要的大小。

硬编码:数组abcde被硬编码为特定的值。虽然这在这个特定的问题中是可行的,但如果你想改变这些值,你需要修改多个地方。考虑将这些值存储在一个二维数组中,这样你就可以更容易地修改它们。

#include <iostream>

using namespace std;

void fama(int receive)

{

  int N = receive;

  int ans[5];

  int a[3] = {0,1,-1};

  int b[3] = {0,3,-3};

  int c[3] = {0,9,-9};

  int d[3] = {0,27,-27};

  int e[3] = {0,81,-81};

  for(int i=0;i<3;i++)

  {

    for(int j=0;j<3;j++)

    {

      for(int k=0;k<3;k++)

      {

        for(int m=0;m<3;m++)

        {

          for(int n=0;n<3;n++)

          {

            if(a[i]+b[j]+c[k]+d[m]+e[n] == N)

            {

              ans[4] = a[i];

              ans[3] = b[j];

              ans[2] = c[k];

              ans[1] = d[m];

              ans[0] = e[n];

            }

          }

        }

      }

    }

  }

  for(int i=0;i<5;i++)

  {

    // cout << ans[i] << endl;

    if(i==0 || ans[i] < 0 || ans[i-1] == 0)

    {

      if(ans[i] == 0)

      {

        continue;

      }

      cout << ans[i];

    }  

    else if(ans[i] > 0) cout << "+" << ans[i];

  }

  cout << endl;

}

int main()

{

  // 请在此输入您的代码

  int N;

  cin >> N;

  fama(N);

  return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值