hello,大家好,我们又见面啦,没错,我是cre,今天继续,算法之旅.今天的一节是字符数组.
我把问题敲了一遍,目的是让大家能看问题,然后可以思考一下.
问题如下:
/* *2017-8-17 * 竖式问题:找出形如abc * de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于 * 一个特定的数字集合.输入数字集合(相邻数字之间没有空格),输出所有竖式.每个竖式前应有编号 * ,之后应有个空行,最后输出解的总数,具体格式见样例输出,为了便于观察,竖式中的空格改用小数点 * 表示,但所写程序中应该输出空格,而非小数点 * * 输入: * 2357 * 输出 * <1> * ..775 * X..33 * ----- * .2325 * 2325 * ----- * 25575 * * * The number of solutions = 1 */
我们分析一下吧,
1.首先是读入用户的数据,我们使用scanf("%s", s);,这个函数会读入一个不含空格,TAB和回车符的字符串存入字符数组中,//注意s前面没有&,扩展知识:如果是char s[maxn][maxm];那么可以用scanf("%s",s[i]);来读取第i个字符串,因为字符串读取遇到空白字符就会停下来.
2.%5d是按5位数来打印的,不足不空格,而%03d是按3位数来打印的,不足补0.
3.strchr(s, buf[i]);函数时用来查找字符buf[i]在s中的位置,成功则返回要查找字符第一次出现的位置,失败返回NUL
4.sprintf是格式输入到字符串中
5.strlen返回的是字符串的实际长度,而实际长度是指结束标记符' '的字符个数,此外c语言中,字符串是以' '结尾的,所以s[strlen[n]]正式结束符
6.在字符数组的世界里,要使用strcpy,strcmp.strcat来进行复制,比较和连接.
7乘法竖式,首先乘法规则大家应该都清楚,三位数乘以两位数,自然是先两位数的各位乘以三位数,然后加上两位数的十位数乘以三位数,所以
这里我们定义x,y来保存这两个结果.用z保存整个的运算结果,然后我们需要用字符数组
好了我们看代码吧
#include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { int count = 0; char s[20], buf[99]; scanf("%s", 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; sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z); int ok = 1; for (int i = 0; i < strlen(buf); i++) if (strchr(s, buf[i]) == NULL) 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; }
运行结果:
ok,今天的内容到这里了,拜拜<._.>!