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; }
时间: 2024-11-05 06:27:37