LHL算法入门经典 例题3-3竖式问题

问题描述:

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>中。

发布了33 篇原创文章 · 获赞 14 · 访问量 644

猜你喜欢

转载自blog.csdn.net/Simple_questions/article/details/104948461