zoukankan      html  css  js  c++  java
  • 【acdream】小晴天老师系列——竖式乘法

    C - 小晴天老师系列——竖式乘法

    Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)
    Submit Status

    Problem Description

    小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本《AC is not a dream》杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为0,但是有一些数字被隐藏掉了,然后让你根据没有隐藏的数字填出隐藏的数字。

    如下图:

    然后小晴天二话不说,三下五除二就写出了答案:

    然后小晴天就觉得这样的题目太简单了,于是问你是否有办法来求出一道题目有多少种不同的答案呢?(只要有一个方框有不同的数字即为不同的答案)

    Input

    多组数据,首先是一个整数t(t<=20),表示数据组数。

    对于每组数据,用5行表示一个竖式,每行均为一个字符串,仅含有星号(*)与数字('0'~'9')组成,其中星号表示空白

    其中第一行为长度为3的字符串。

    第二行为长度为2的字符串。

    第三行为长度为4的字符串。

    第四行为长度为3的字符串。

    第五行为长度为5的字符串。

    Output

    对于每组数据,输出一个整数x,表示符合乘法竖式法则的填法的种类。

    Sample Input

    2
    ***
    **
    3384
    846
    *****
    4**
    **
    3384
    846
    *****

    Sample Output

    2
    1

    题目意思就是找到符合条件的算式个数,因为是确定的3位数乘2位数,直接暴力搜索就好了,判断是否符合条件是,用sprintf把int转为字符串比较会方便些。
    #include <iostream>
    #include <algorithm>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    using namespace std;
     
    char s1[10];
    char s2[10];
    char s3[10];
    char s4[10];
    char s5[10];
    bool check(int a,int b){
        int a1[] = {a/100,a/10%10,a%10};
        int b1[] = {b/10,b%10};
        int qs3[3];
        qs3[0]=a*b1[1];
        qs3[1]=a*b1[0]*10;
        qs3[2]=qs3[0]+qs3[1];
        char str[10];
        if(qs3[0]< 1000 || qs3[1]<1000 || qs3[2]<10000 || qs3[0]> 9999 || qs3[1]>9999 || qs3[2]>99999)
            return 0;
        sprintf(str,"%d",a);
        for(int i=0;i<3;i++){
            if(s1[i]!='*'){
                if(s1[i]!=str[i])
                    return 0;
            }
        }
        sprintf(str,"%d",b);
        for(int i=0;i<2;i++){
            if(s2[i]!='*'){
                if(s2[i]!=str[i])
                    return 0;
            }
        }
        sprintf(str,"%d",qs3[0]);
        for(int i=0;i<4;i++){
            if(s3[i]!='*'){
                if(s3[i]!=str[i])
                    return 0;
            }
        }
        sprintf(str,"%d",qs3[1]);
        for(int i=0;i<3;i++){
            if(s4[i]!='*'){
                if(s4[i]!=str[i])
                    return 0;
            }
        }
        sprintf(str,"%d",qs3[2]);
        for(int i=0;i<5;i++){
            if(s5[i]!='*'){
                if(s5[i]!=str[i])
                    return 0;
            }
        }
        return 1;
    }
    int main(){
        int t;
        cin>>t;
        while(t--){
            cin>>s1;
            cin>>s2;
            cin>>s3;
            cin>>s4;
            cin>>s5;
            int cont=0;
            for(int i=100;i<=999;i++){
                for(int j=10;j<=99;j++){
                    if(check(i,j))
                        cont++;
                }
            }
            cout<<cont<<endl;
        }
        return 0;
    }
  • 相关阅读:
    逻辑分支中if小括号中的隐式转换
    逻辑运算符
    CSS——元素的显示与隐藏
    JS对象
    JS预解析与变量提升
    JS作用域
    JS函数
    CSS定位(position)
    JS数组
    JS分支结构与循环结构
  • 原文地址:https://www.cnblogs.com/Webhood/p/4453781.html
Copyright © 2011-2022 走看看