分享免费的编程资源和教程

网站首页 > 技术教程 正文

ACM 基础之竖式问题的基本解法C语言练手小项目含代码及详解

goqiw 2024-09-20 22:54:36 技术教程 75 ℃ 0 评论

题目: 来自刘汝佳的《算法竞赛入门经典》


找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。

样例输入:2357

样例输出:

<1>

..775

X..33

-----

.2325

2325.

-----

25575

The number of solutions = 1

分析:

刚开始看题目的时候,没看懂,后来才发现,样例输出的就是一个竖式的乘法,但是这个竖式乘法里所有涉及的数字都要是输出的数字集合,也就是(abc,de,积)∈输入的数字集合。

既然弄清了题意,那就看看题如何解决吧。我们可以尝试所有的abc,de,判断是否符合条件,符合条件的输出,不符合条件的舍弃。但是本题有两个难点:

  1. 如何判断abc,de,积都在输入的数字集合中,
  2. 输出的格式

再看的小伙可以想想哦,尤其是第一个。

在这里我们先写出伪代码:

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;
}




如果有兴趣的小伙伴记得一定要上级自己尝试一下哦!

如有错误欢迎指出!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表