/*
竖式问题:
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。
输入:数字集合(相邻数字之间没有空格),
输出:所有竖式。
每个竖式前应有编号,之后有一个空行。最后输出解的总数。(本质上是一个乘法)
输入:
2357
输出:
<1>
775
X 33
2325
2325
25575
The number of solutions = 1
*/
/*
关键:
1 a 97 小大
2 if(strchr(str,strRes[k]) == NULL) //char* strchr(const char* str,int ch)用于字符查找,若找到,返回在字符串中位置,找不到返回NULL
3 注意本题中竖式的每个数字必须在集合中。通过sprintf(strRes,"%d%d%d%d%d",i,j,iOne,iTen,iRes);//易错,是整个竖式中,而不是一个竖式中的数字在数字集合中
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024
void erectFormula()
{
int iCount = 0;
char str[MAXSIZE];
scanf("%s",str);
for(int i = 111 ; i <= 999 ; i++)
{
for(int j = 11 ; j <= 99 ; j++)
{
int iOne = i*(j%10);
int iTen = i*(j/10);
int iRes = i*j;
char strRes[MAXSIZE];
sprintf(strRes,"%d%d%d%d%d",i,j,iOne,iTen,iRes);//易错,是整个竖式中,而不是一个竖式中的数字在数字集合中
//if(1)//符合乘积中所有数字均在数字集合这个条件
bool ok = true;
for(int k = 0 ; strRes[k] != '\0' ; k++)
{
if(strchr(str,strRes[k]) == NULL)//char* strchr(const char* str,int ch),返回ch在str中首次出现位置,若找不到则为NULL
{
ok = false;
break;
}
}
if(ok)
{
iCount++;
printf("<%d>\n",iCount);
printf("%5d\nX%4d\n \n",i,j);
//打印两次乘积
printf("%5d\n%4d\n \n%5d\n",iOne,iTen,iRes);
}
}
}
printf("\nThe number of solutions = %d\n",iCount);
}
int main(int argc,char* argv[])
{
erectFormula();
system("pause");
return 0;
}