竖式乘法

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
原文地址:https://www.cnblogs.com/linxhsy/p/4455384.html