码迷,mamicode.com
首页 > 其他好文 > 详细

竖式乘法

时间:2015-04-25 10:37:03      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

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\n",a,b,c,d,e,num1,num2,temp1,temp2,temp3);
 98                             cou++;
 99                         }
100                     }
101                 }
102             }
103         }
104         printf("%d\n",cou);
105     }
106     return 0;
107 }
View Code

 

竖式乘法

标签:

原文地址:http://www.cnblogs.com/linxhsy/p/4455384.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!