需要消除循环

问题描述 投票:0回答:1

这是一个彩票游戏。每个顾客可以拥有一张或多张票。门票的号码序列为 6 位数字。每个位置可以有数字0-9。

有幸运券号码。客户可以根据数字与位置的匹配来获得差异。以下代码将描述礼物选择过程:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    vector<string> customerTickets;
    string luckyTicket;
    int totalNumberOfTickets;

    cin>>totalNumberOfTickets;

    for(int i=0; i<totalNumberOfTickets; ++i) {
        string s;
        cin>>s; // 6 digit long string

        customerTickets.push_back(s);
    }

    cin>>luckyTicket;

    int totalGiftAmount = 0;

    for(int i=0; i<totalNumberOfTickets; ++i) {
        int match = 0;
        for(int j=0; j<6; ++j) {
            if(customerTickets[i][j] == luckyTicket[j]) match++;
        }

        if(match==6) totalGiftAmount+=100;
        else if(match==5) totalGiftAmount+=50;
        else if(match==4) totalGiftAmount+=40;
        else if(match==3) totalGiftAmount+=10;
    }

    cout<<totalGiftAmount;
}

我需要摆脱循环。因为我需要查看千元幸运券的赠品金额。是否可以在 O(1) 内计算出礼物金额?

c++ optimization hash
1个回答
0
投票

你们的程序表明中奖数字在幸运彩票和中奖彩票中的位置应该相同。订单算吗? 接受这一点,为什么不声明一个 Ticket 类,将其用于 luckyTicket 和 customerTickets 向量?为什么不使用 stl 算法,切换比 ifelseifelseif 更可读,有时更快? 我会像这样编码stg

#include <algorithm>
#include <iostream>
#include <string>


class Ticket {
public :
  Ticket () : val_ (6, '0') {}
  Ticket (const Ticket& t) : val_ (t.val_) {}
  ~Ticket () {}
  int match (const Ticket& t) const {
    int n (0);
    auto i (val_.begin ()), j (t.val_.begin ());
    for (; i != val_.end (); ++i, ++j) n += (*i == *j)?1:0;
    return n;
  }

  int gift_amount (const Ticket& luckyticket) const {
    int s (0);
    switch (match (luckyticket)) {
    case 3 : s += 10; break;
    case 4 : s += 40; break;
    case 5 : s += 50; break;
    case 6 : s += 100; break;
    }
    return s;
  }
  void read (std::istream& is) {
    is >> val_;
  }
  std::string val_;
};


int main (int argc, char* argv []) {
  int totalNumberOfTickets;
  std::cout << "number of ticket : "; std::cin >> totalNumberOfTickets;
  std::vector<Ticket> customerTickets (totalNumberOfTickets, Ticket ());
  Ticket luckyTicket; 
  std::cout << "lucky ticket : " << std::endl;luckyTicket.read (std::cin);
  std::cout << "tickets :" << std::endl;
  {
    auto i ((int) 0);
    std::for_each (customerTickets.begin (), customerTickets.end (), [&i] (auto& t) {
      std::cout << "\tticket " << i << " : " << std::endl;
      t.read (std::cin);
      ++i;
    });
  }
  auto totalGiftAmount ((int) 0);
  std::for_each (customerTickets.begin (), customerTickets.end (),   [&totalGiftAmount, &luckyTicket] (const auto& t) {
    totalGiftAmount += t.gift_amount (luckyTicket);
  });
  std::cout << "TotalGiftAmount == " << totalGiftAmount << std::endl;
  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.