算法竞赛入门经典_3.2_字符数组_竖式问题

  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,今天的内容到这里了,拜拜<._.>!

原文地址:https://www.cnblogs.com/ncgds/p/7384941.html