C语言《竖式问题》

问题描述:
找出所有形如“abc*de”(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
C语言《竖式问题》_第1张图片
题目分析:
因为题目需要打印出每个竖式,类似于平时我们手动算乘法的运算形式(X表示的是乘号),样例输出中的“-----”上方不做要求,即要求的是“-----”下方的两行数。假设第一行每个数字表示一个元素,它用集合A表示,同理第二行用集合B表示,而最初输入的所有数字也将它用一个集合S表示,所以要求集合A和B 都包含于集合S,则此题目的要求就成立了。剩下的则是一些格式问题。
代码:

#include
#include
int main()
{
	int count = 0;
	char s[20], buf[99];
	scanf("%s", s);
	int abc,de,i; 
	for(abc=100;abc<=999;abc++)
		for (de = 10; de <= 99; de++)
		{
			int x = abc * (de % 10);//得到“abc*e” ,即“-----”下方第一行的值
			int y = abc * (de / 10);//得到“abc*d” ,即“-----”下方第二行的值
			int z = abc * de;//得到最终的结果即abc*de 
			sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z);//将abc,de,x,y,z的结果输出到字符数组buf中 
			int ok = 1;
			for (i = 0; i < strlen(buf); i++)//遍历整个数组buf,看是否满足条件 
				if (strchr(s, buf[i]) == NULL)//在buf字符串中查找是否出现过s数组中的数 
					ok = 0;
			if (ok) //如果OK为真 
			{
				printf("<%d>\n", ++count);
				printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);//按照5位数打印 ,不足5位前面打空格 
			}
			
		}printf("The number of sulotions= %d\n", count);
	//system("pause");
	return 0;
}

你可能感兴趣的:(数组,竖式问题)