• 竖式乘法


    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


      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <math.h>
      5 #include <string.h>
      6 using namespace std;
      7 #define lenstr 7
      8 char s1[lenstr],s2[lenstr],s3[lenstr],s4[lenstr],s5[lenstr];
      9 /**
     10 鉴于乘数内含有变量,我将每个都取出来,然后做到乘数内不变的数不变。
     11 起先使用标记,后面发现标记后的东西只能用一次。(过了当前循环就不能用了)
     12 后面改用上下限,就可以做到不变的量不变。
     13 感谢鑫哥。
     14 */
     15 int main()
     16 {
     17     int t,cou;
     18     scanf("%d",&t);
     19     getchar();
     20     while(t--)
     21     {
     22         cou=0;
     23         gets(s1);
     24         gets(s2);
     25         gets(s3);
     26         gets(s4);
     27         gets(s5);
     28         int min1=1,max1=9;
     29         if(s1[0]!='*') {min1=max1=s1[0]-'0';}
     30         for(int a=min1;a<=max1; a++)
     31         {
     32             int min2=0,max2=9;
     33             if(s1[1]!='*') {min2=max2=s1[1]-'0';}
     34 
     35             for(int b=min2; b<=max2; b++)
     36             {
     37                 int min3=0,max3=9;
     38                 if(s1[2]!='*') {min3=max3=s1[2]-'0';}
     39 
     40                 for(int c=min3; c<=max3; c++)
     41                 {
     42                     int min4=1,max4=9;
     43                     if(s2[0]!='*') {min4=max4=s2[0]-'0';}
     44 
     45                     for(int d=min4; d<=max4; d++)
     46                     {
     47                         int min5=0,max5=9;
     48                         if(s2[1]!='*') min5=max5=s2[1]-'0';
     49 
     50                         for(int e=min5; e<=max5; e++)
     51                         {
     52                             int num1=a*100+b*10+c;
     53                             int num2=d*10+e;
     54                             int temp1=num1*e;
     55                             int temp2=num1*d;
     56                             int temp3=num1*num2;
     57                             char s[10],ss[10],sss[10];
     58 
     59                             sprintf(s,"%d",temp1);
     60                             int len=strlen(s);
     61                             if(len!=4) continue;
     62                             int flag=0;
     63                             for(int i=0; i<len; i++)
     64                             {
     65                                 if(s3[i]=='*') continue;
     66                                 else if(s3[i]!=s[i])
     67                                 {
     68                                     flag=1;
     69                                     break;
     70                                 }
     71                             }
     72                             if(flag) continue;
     73 
     74                                 sprintf(ss,"%d",temp2);
     75                                 len=strlen(ss);
     76                                 if(len!=3) continue;
     77                                 for(int i=0; i<len; i++)
     78                                 {
     79                                     if(s4[i]=='*') continue;
     80                                     else if(s4[i]!=ss[i])
     81                                     {
     82                                         flag=1;
     83                                         break;
     84                                     }
     85                                 }
     86                                 if(flag) continue;
     87 
     88                                 sprintf(sss,"%d",temp3);
     89                                 len=strlen(sss);
     90                                 if(len!=5) continue;
     91                                 for(int i=0; i<len; i++)
     92                                 {
     93                                     if(s5[i]=='*') continue;
     94                                     else if(s5[i]!=sss[i]) {flag=1;break;}
     95                                 }
     96                                 if(flag) continue;
     97                             //printf("%d %d %d %d %d  %d %d %d %d %d
    ",a,b,c,d,e,num1,num2,temp1,temp2,temp3);
     98                             cou++;
     99                         }
    100                     }
    101                 }
    102             }
    103         }
    104         printf("%d
    ",cou);
    105     }
    106     return 0;
    107 }
    View Code
  • 相关阅读:
    0是字符串的终止符
    c语言中获取数组的长度写法
    c语言第一个程序
    linux下adb连接不上解决方法
    android的apk权限查看
    dumpsys netpolicy中state的含义
    查看ps和dumpsys netpolicy
    批量安装/卸载手机apk--python语言
    【转载】Think as Customer 以客户为中心的测试理念
    利用xampp进行https操作
  • 原文地址:https://www.cnblogs.com/linxhsy/p/4455384.html
Copyright © 2020-2023  润新知