• 牛式个数


    下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。

          * * *
       x    * *
        -------
          * * *
        * * *
        -------
        * * * *

    数字只能取代*,当然第一位不能为0。 写一个程序找出所有的牛式。

    输入

    第一行,数字的个数n。
    第二行:N个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9})。

    输出

      共一行,一个数字。表示牛式的总数。 下面是样例的那个牛式。

          2 2 2
        x   2 2
         ------
          4 4 4
        4 4 4
      ---------
        4 8 8 4

    样例输入

    5
    2 3 4 6 8
    样例输出
    1

    思路:

    1、枚举。一维数组存储三位数、二维数组存储二位数

    2、暴力验证。

    遇到的问题:

    1、答案错误。由于三位数情况未考虑周全,ABB和AAB情况为考虑进去。最后索性三重(0-n)循环

    2、运行错误。一维数组空间开辟小了,导致越界存储和访问。

     

     1 #include <iostream>
     2 #include <algorithm>
     3 
     4 using namespace std;
     5 
     6 int n_nums = 0;
     7 int n_up = 0, n_down = 0;
     8 
     9 void Init(int nums[],int nUp[],int nDown[][2]);
    10 bool InNums(int tp,int nums[]);
    11 bool IsOk(int tp,int nums[]);
    12 void Solve();
    13 
    14 int main()
    15 {
    16     Solve();
    17     return 0;
    18 }
    19 void Solve()
    20 {
    21     //9225
    22     int nUp[9226],nums[10];
    23     int nDown[82][2];
    24     Init(nums,nUp,nDown);
    25     int ans = 0;
    26     int i, j;
    27     int tp1, tp2, tp3;
    28     bool b1, b2;
    29     for (i = 0; i < n_up; i++)
    30     {
    31         for (j = 0; j < n_down; j++)
    32         {
    33             tp1 = nDown[j][0] * nUp[i];
    34             tp2 = nDown[j][1] * nUp[i];
    35             tp3 = nUp[i] * (nDown[j][0] * 10 + nDown[j][1]);
    36             b1 = (tp1 <= 999 && tp1 >= 100 && tp2 <= 999 && tp2 >= 100) ? 1 : 0;
    37             b2 = (tp3 <= 9999 && tp3 >= 1000) ? 1 : 0;
    38             if (b1&&b2)
    39             {
    40                 if (IsOk(tp1,nums) && IsOk(tp2,nums) && IsOk(tp3,nums)) {
    41                     ans++;
    42                 }
    43             }
    44         }
    45     }
    46     cout << ans << endl;
    47 }
    48 void Init(int nums[],int nUp[],int nDown[][2])
    49 {
    50     int n, i, j, k, get;
    51     cin >> n;
    52     for (i = 0; i < n; i++)
    53     {
    54         cin >> get;
    55         if (!InNums(get,nums))
    56         {
    57             nums[n_nums++] = get;
    58         }
    59     }
    60     sort(nums, nums + n_nums);
    61     for(i=0; i<n_nums;i++)
    62         for(j=0; j<n_nums; j++)
    63             for(k=0; k<n_nums; k++)
    64                 nUp[n_up++]=nums[i]*100+nums[j]*10+nums[k];
    65     for(i=0; i<n_nums; i++)
    66         for(j=0; j<n_nums; j++)
    67         nDown[n_down][0]=nums[i],nDown[n_down++][1]=nums[j];
    68 }
    69 bool InNums(int tp,int nums[])
    70 {
    71     for (int i = 0; i < n_nums; i++)
    72         if (tp == nums[i])
    73             return true;
    74     return false;
    75 }
    76 bool IsOk(int tp,int nums[])
    77 {
    78     int b = tp % 10;
    79     while (tp)
    80     {
    81         if (!InNums(b,nums)) {
    82             return false;
    83         }
    84         tp /= 10;
    85         b = tp % 10;
    86     }
    87     return true;
    88 }
    View Code
  • 相关阅读:
    两小时后执行打开浏览器的操作
    Markdown语法
    Python机器学习2.2
    身份证姓名与身份证号校验
    根据银行卡号获取开户行
    生成微信小程序二维码
    .net 生成二维码
    微信支付API V3(.Net Core)
    .net 生成项目xml描述文件
    汉字排序问题
  • 原文地址:https://www.cnblogs.com/guoyujiang/p/11831755.html
Copyright © 2020-2023  润新知