直接上题目:
小晴天老师系列——竖式乘法
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
Hint
样例1,除了题目中的那种情况,还有这种
而样例2,因为第一个数的百位被固定为4,故只有一种填法。
Submit Status
题目意思很明确,只要用i,j遍历两位的乘数,满足条件则给ans+1就行
#include <stdio.h> #include <stdlib.h> #include <string.h> int pj(char a[],char b[],int n)//判断是否吻合条件 { int i; if(strlen(a)!=n)//长度不对直接结束 return 0; for(i=0;i<n;i++) { if((a[i]!=b[i]&&b[i]!=‘*‘)) return 0;//不吻合 } return 1;//吻合 } int main() { int t,i,j,ans=0; char a[10],b[10],c[10],d[10],e[10],x[10]; scanf("%d",&t); while(t--) { scanf(" %s",a); scanf(" %s",b); scanf(" %s",c); scanf(" %s",d); scanf(" %s",e); ans=0; for(i=100;i<1000;i++) { sprintf(x,"%d",i);//acdream用标准库没有itoa,sprint功能和itoa一样 if(!pj(x,a,3)) continue; for(j=10;j<100;j++) { sprintf(x,"%d",j); if(!pj(x,b,2)) continue; sprintf(x,"%d",j%10*i); if(!pj(x,c,4)) continue; sprintf(x,"%d",j/10*i); if(!pj(x,d,3)) continue; sprintf(x,"%d",j/10*i*10+j%10*i); if(!pj(x,e,5)) continue; ans++;//所有条件都满足了自加 } } printf("%d\n",ans); } return 0; }
有一点要注意就是:acdream用标准库没有itoa,sprint功能和itoa一样,一开始用itoa编译错误了两次
时间: 2024-10-25 06:13:14