算法竞赛入门经典 第3章 数组和字符串 学习笔记 3

算法竞赛入门经典 第3章 数组和字符串 学习笔记 3

字符数组

我要成功,一念既出,万山无阻
在C语言中,字符串实际上就是字符数组
竖式问题。找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中, 所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有 竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出 (为了便于观察,竖式中的空格改用小数点显示,但所写程序中应该输出空格,而非小数点)。
样例输入: 2357
样例输出:

<1> 
..775 
X..33 
----- 
.2325 
2325. 
----- 
25575 
The number of solutions = 1

耐心看这个样例,就是竖式相乘,.2325 是中间结果
思路:尝试所有的abc和de,判断是否满足条件
“scanf("%s", s)”。和“scanf("%d", &n)”类似,它会读入一个不含空格、 TAB和回车符的字符串,存入字符数组s。注意,不是“scanf("%s", &s)”,s前面没有“&”符号
在“scanf("%s", s)”中,不要在s前面加上“&”符号。如果是字符串数组char s[maxn] [maxl],可以用“scanf("%s", s[i])”读取第i个字符串。注意,“scanf("%s", s)”遇到 空白字符会停下来。

这里复习一下前面提到的内容:
关于输出:
printf 输出到屏幕
fprintf 输出到文件
sprintf 输出到字符串 (注:要保证字符串足够大)

strchr:在一个字符串中查找单个字符 找出在字符串str中第一次出现字符ch的位置,找到就返回该字符位置的指针(也就是返回该字符在字符串中的地址的位置),找不到就返回空指针(就是 null)。
字符串的本质是数组,所以只能用 strcpy(a,b) 赋值
strcmp(a,b) 比较 strcat(a,b) 连接

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int count=0;
	char s[20];
	char buf[99];
	cin>>s;
	for(int abc=111;abc<=999;abc++)
	{
		for(int de=11;de<=99;de++)
		{
			int x=abc*(de%10),y=abc*(de/10),z=abc*de;   //x=2325 
			sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);         //输出到buf这个字符串中 
			int ok=1;
			for(int i=0;i<strlen(buf);i++)
			{
				if(strchr(s,buf[i])==NULL) ok=0;  //只要有一个buf[i]不在s里,ok就等于0
			}
			if(ok)
			{
				printf("<%d>
", ++count);
				printf("%5d
X%4d
-----
%5d
%4d
-----
%5d

", abc, de, x, y, z);
			}
		}
		printf("The number of solutions = %d
", count);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/serendipity-my/p/12635353.html