【USACO】Cryptarithm

本文解析了一道程序设计竞赛题目,使用C++语言实现了一个判断特定数字组合下乘法运算结果是否符合预设条件的算法。通过对输入的特定数字集合进行遍历,找出所有可能的四位数乘法结果,并验证其是否由给定数字构成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
ID:
PROG: crypt1
LANG: C++11
*/
#include<iostream>
#include<cstdio>

using namespace std;

int N;
int a[11] = {};

inline bool fit(int num, int n){
  if (num == 0)
    return true;
  if (n == 3 && !(num >= 100 && num <= 999))
    return false;
  if (n == 4 && !(num >= 1000 && num <= 9999))
    return false;
  while (num != 0){
    int t = num % 10;
    num /= 10;
    bool tag = false;
    for (int i = 0; i < N; i ++){
      if (t == a[i]){
        tag = true;
        break;
      }
    }
    if(!tag)
      return false;
  }
  return true;
}

int main()
{
  freopen("crypt1.in","r", stdin);
  freopen("crypt1.out", "w", stdout);
  cin >> N;
  for (int i = 0; i < N; i ++){
    cin >> a[i];
  }
  int count = 0;
  for (int k = 0; k < 5; k ++){
    for (int l = 0; l < N; l ++){
      b[k] = a[l];
    }
  }
  for (int i1 = 0; i1 < N; i1 ++){
    if (a[i1] == 0)
      continue;
    for (int i2 = 0; i2 < N; i2 ++){
      for (int i3 = 0; i3 < N; i3 ++){
        for (int j1 = 0; j1 < N; j1 ++){
          if (a[j1] == 0)
            continue;
          for (int j2 = 0; j2 < N; j2 ++){
            int t = a[i1] * 100 + a[i2] * 10 + a[i3];
            int ans1 = t * a[j2];
            if (!fit(ans1, 3))
              continue;
            int ans2 = t * a[j1];
            if (!fit(ans2, 3))
              continue;
            int ans = ans1*10 + ans2;
            if (fit(ans, 4))
              count ++;
          }
        }
      }
    }
  }
  cout << count << endl;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值