题目: 来自刘汝佳的《算法竞赛入门经典》
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。
样例输入:2357
样例输出:
<1>
..775
X..33
-----
.2325
2325.
-----
25575
The number of solutions = 1
分析:
刚开始看题目的时候,没看懂,后来才发现,样例输出的就是一个竖式的乘法,但是这个竖式乘法里所有涉及的数字都要是输出的数字集合,也就是(abc,de,积)∈输入的数字集合。
既然弄清了题意,那就看看题如何解决吧。我们可以尝试所有的abc,de,判断是否符合条件,符合条件的输出,不符合条件的舍弃。但是本题有两个难点:
- 如何判断abc,de,积都在输入的数字集合中,
- 输出的格式
再看的小伙可以想想哦,尤其是第一个。
在这里我们先写出伪代码:
char s[20];
int count =0;
scanf("%s",s);
for(int abc=100;abc<=999;abc++)
for(int de=10;de<=99;de++)
if("abc*de"符合条件)
{
printf("<%d>",++count);
输出样例形式;
count++
}
那我们先解决比较简单的问题吧,就是它的输出格式。
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
看样子这个问题很好解决,但是要对printf函数输出格式比较熟悉。
那现在我们解决第二个问题:如何才能知道abc*de是符合条件的呢?
我们可以把竖式中所有的数字都放到一个字符数组buf中,再用strchr函数来比较buf数组中是否都能匹配到数字集合中。
//下面是 strchr() 函数的声明。
char *strchr(const char *str, int c)
//参数
//str -- 要被检索的 C 字符串。
//c -- 在 str 中要搜索的字符。
//返回值
//该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
我们用sprintf函数把竖式中的数字放到数组buf中。至于sprintf的用法可以自行搜索。但是,只要知道他是把数据写入指定的数组就行。
这样基本上就解决问题啦
下面上代码:
#include <stdio.h>
#include <string.h>
int main ()
{
char jihe[10],buf[99];
int abc,de,s1,s2,s,flag,i,count=0; //s1用来存储abc*de的个位,s2用来存储abc*de的十位,s用来存储abc*de的积
scanf("%s",jihe);
for(abc=100;abc<=999;abc++)
{
for(de=10;de<=99;de++)
{
s1=abc*(de%10);
s2=abc*(de/10);
s=abc*de;
sprintf(buf,"%d%d%d%d%d",abc,de,s1,s2,s);//将用到的数字放入数组
flag=1; // 假设所有的都符合
for(i=0;i<strlen(buf);i++)
if(strchr(jihe,buf[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,s1,s2,s);
}
}
}
printf("The number of solutions=%d\n",count);
return 0;
}
如果有兴趣的小伙伴记得一定要上级自己尝试一下哦!
如有错误欢迎指出!
本文暂时没有评论,来添加一个吧(●'◡'●)