小孩的游戏

安奴是一个特别精于数字游戏的小女孩,如果给她一组可以重复的正整数,通过这组数的加、减或保留的任意组合运算(每次计算时每个数只参加一次或不参加),她可以立即计算出所有可能的互不相同正整数的个数。

例如,如果给她三个整数:283,她将立即告诉你可以产生11个不同的正整数,即:12356789101113

 

输入(请使用标准输入输出,而不要读写文件)

Ø        输入可以包含多个测试用例

Ø        每个用例的第一行给出两个整数:用例号c与给安奴的正整数个数kk<15);

Ø        每个用例的第二行给出k个以一个空格分隔的任意排序的整数

Ø        用例号c0时表示输入结束

输出(请使用标准输入输出,而不要读写文件)

每个测试用例输出一行:用例号c、可以产生的正整数个数,中间用一个空格分隔。

 

案例号

输入举例

输出举例

1

1 2

2 3

1 4

2

2 3

2 3 8

2 11

3

3 4

2 5 5 4

3 14

 

4

0

 

 

 

 

解法1:

#include <iostream>

#include <set>

#include <vector>

 

using namespace std;

 

void main()

{

       long a[15];

       do

       {

              int c, n;

              cin >> c;

              if (c == 0)

                     break;

             

              cin >> n;

              if (n > 15)

                     break;

             

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

                     cin >> a[i];

 

               

              vector<long> sum;

              sum.push_back( 0 );

      

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

              {

                     //vector中的数与当前数进行相加和相减运算,然后压入vector

                     int iSize = sum.size();

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

                     {

                            sum.push_back( sum.at(k) + a[j] );

                            sum.push_back( sum.at(k) - a[j] );

                     }

         

              }

       

              set<long> s;

              int iCount = sum.size();

              for ( int l =0 ; l < iCount ; l++ )

              {

                     //vector中的正数插入set

                     if ( sum.at(l) >0 )

                     {

                            s.insert( s.begin(), sum.at(l) );

                     }

              }

 

              cout<<c<<" "<<s.size()<<endl;

      

       }while (true);

}

 

 

解法2:当年一个朋友写的

 

#include <iostream>

#include <set>

#include <iomanip>

#include <algorithm>

using namespace std;

 

class St

{

public:

       enum { MAX_SIZE = 20 };

       St(int [], int );

       int GetAn();

      

private:

       bool inc();

       int getsum();

       int c[MAX_SIZE];

       int f[MAX_SIZE];

       int count;

       set<int> s;

};

 

int main()

{

       int a[St::MAX_SIZE];

       int i = 1;

       do

       {

              int c, n;

              cout << i << " >";

              cin >> c;

              if (c == 0)

                     break;

             

              cin >> n;

              if (n > St::MAX_SIZE)

                     break;

             

              cout << ">";

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

                     cin >> a[j];

             

              St s(a, n);

              cout << i << "=>" << s.GetAn() << endl << endl;

              i++;

       }while (true);

       return 0;

}

 

St::St(int a[], int n)

{

       if (n > MAX_SIZE)

       {

              cout << "输入的数字个数太多/n";

       }

       else

       {

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

              {

                     f[i] = 0;

                     c[i] = a[i];

              }

              count = n;

       }

}

 

int St::getsum()

{

       int sum;

       int i = 0;

      

       while (f[i] == 2)

              i++;

       sum = c[i];

       if (i == count)

              sum = 0;

       i++;

       while (i < count)

       {

              if (f[i] == 0)

                     sum += c[i];

              else if (f[i] == 1)

                     sum -= c[i];

              i++;

       }

       return sum;

}

 

bool St::inc()

{

       int i = 0;

       f[i]++;

      

       while (f[i] >= 3)

       {

              f[i+1]++;

              f[i] = f[i]-3;

              i++;

       }

      

       if (i == count)

              return false;

       return true;

}

 

int St::GetAn()

{

       int w;

       do

       {

              w = getsum();

              if (w < 0)

                     w = -1*w;

              if (w != 0)

                     s.insert( s.begin(), w );

       }while ( inc() );

 

       return s.size();

}

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值