竖式问题
题目描述
找出所有形如 abc∗de (三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字合。
输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序中应该输出空格,而非小数点)。
输入
输入数字集合(相邻数字之间没有空格)。
输出
输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序中应该输出空格,而非小数点)。
样例输入
2357
样例输出
<1>
775
X 33
2325
2325
-----25575
The number of solutions=1
解题思路
该问题的大致思路为:先定义两个字符型的数组s,d;s:用来存储输入的一串数字;d:用来存储abc,de,abc*(de%10),abc*(de/10),abc*de;然后把这几个数值使用sprintf输入到数组中,然后 使用strchr(s,d[i])来判断d[i]是否在s中存在。这个过程定义了一个表示变量flag,先给flag 赋值为1,如果d[i]不存在s中则使flag为0,如果到最后flag还是为1,则说明满足解,输出即可
图片:
代码如下
#include <stdio.h>
#include <string.h>
#define m 100
int main()
{
char s[m];
char d[m];
scanf("%s",&s);
int count=0;
int abc,de;
for(abc=100;abc<=999;abc++)
{
for(de=10;de<=99;de++)
{
int x,y,z;
x = abc*(de % 10);
y = abc*(de / 10);
z = abc * de;
sprintf(d, "%d%d%d%d%d", abc, de, x, y, z);
int flag = 1;
for (int i = 0; i < strlen(d); i++)
if (strchr(s, d[i]) == NULL)
flag = 0;
if (flag)
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);
}
}
}
printf("The number of solutions=%d",count);
return 0;
}