问题描述:
LHL算法入门经典 例题3-3竖式问题
找出所有形如“abc*de”(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
题目分析:
LHL算法入门经典 例题3-3竖式问题
因为题目需要打印出每个竖式,类似于平时我们手动算乘法的运算形式(X表示的是乘号),样例输出中的“-----”上方不做要求,即要求的是“-----”下方的两行数。假设第一行每个数字表示一个元素,它用集合A表示,同理第二行用集合B表示,而最初输入的所有数字也将它用一个集合S表示,所以要求集合A和B 都包含于集合S,则此题目的要求就成立了。剩下的则是一些格式问题。
#include<stdio.h>
#include<string.h>
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);
return 0;
}
LHL算法入门经典 例题3-3竖式问题
printf、sprintf与fprintf 的用法区分
1.printf 是和标准输出文件(stdout)关联的,fprintf 则没有这个限制.
2.fprintf是用于文件操作的
3.sprintf是格式化输出到一个字符串,fprintf是格式化输出到一个stream,通常是到文件
strchr函数功能为在一个串中查找给定字符的第一个匹配之处。函数原型为:char *strchr(const char *str, int c),即在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。strchr函数包含在C 标准库 <string.h>中。