算法竞赛入门经典: 第三章 数组和字符串 3.4竖式问题

/*
竖式问题:
找出所有形如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;
}

你可能感兴趣的:(算法竞赛入门)