题目描述
下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
* * * x * * ------- * * * * * * ------- * * * *
数字只能取代*,当然第一位不能为0。 写一个程序找出所有的牛式。
输入
第一行,数字的个数n。
第二行:N个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9})。
输出
共一行,一个数字。表示牛式的总数。 下面是样例的那个牛式。
2 2 2 x 2 2 ------ 4 4 4 4 4 4 --------- 4 8 8 4
样例输入
5
2 3 4 6 8
样例输出
1
思路:若使用十二层for循环十分繁琐,而由题可知是三位数与两位数之间的乘法,得到一个四位数。
AC代码:
#include<stdio.h>
int main(void){
int n,x;
int sum=0;
int a[10]={0}; //初始化0~9 不被使用
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[x]=1; //使输入的数使用的状态改变为被使用,方便后面的判断
}
for(int i=100;i<1000;i++){ //判断i是三位数
for(int j=10;j<100;j++){ //判断j是两位数
if(a[i%10]==1&&a[i%100/10]==1&&a[i/100]==1&&a[j%10]==1&&a[j/10]==1&&100<i*(j%10)&&i*(j%10)<1000&&100<i*(j/10)&&i*(j/10)<1000&&i*j>1000&&i*j<10000){ //判断i*j是四位数 并判断每位的数是否是输入的数
int c=i*j,d=i*(j%10),e=i*(j/10);
if(a[c%10]==1&&a[c/10%10]==1&&a[c/100%10]==1&&a[c/1000]==1&&a[d%10]==1&&a[d%100/10]==1&&a[d/100]==1&&a[e%10]==1&&a[e%100/10]==1&&a[e/100]==1){ // 判断每位的数是否是输入的数
sum++;
}
}
}
}
printf("%d\n",sum);
return 0;
}
int n,x;
int sum=0;
int a[10]={0}; //初始化0~9 不被使用
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[x]=1; //使输入的数使用的状态改变为被使用,方便后面的判断
}
for(int i=100;i<1000;i++){ //判断i是三位数
for(int j=10;j<100;j++){ //判断j是两位数
if(a[i%10]==1&&a[i%100/10]==1&&a[i/100]==1&&a[j%10]==1&&a[j/10]==1&&100<i*(j%10)&&i*(j%10)<1000&&100<i*(j/10)&&i*(j/10)<1000&&i*j>1000&&i*j<10000){ //判断i*j是四位数 并判断每位的数是否是输入的数
int c=i*j,d=i*(j%10),e=i*(j/10);
if(a[c%10]==1&&a[c/10%10]==1&&a[c/100%10]==1&&a[c/1000]==1&&a[d%10]==1&&a[d%100/10]==1&&a[d/100]==1&&a[e%10]==1&&a[e%100/10]==1&&a[e/100]==1){ // 判断每位的数是否是输入的数
sum++;
}
}
}
}
printf("%d\n",sum);
return 0;
}