问题 1926 --【字符串】竖式问题

1926: 【字符串】竖式问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 2  解决: 2
[提交][状态][讨论版][命题人:]

题目描述

找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出。

输入

一行,竖式中的数字集合(相邻数字之间没有空格)。

输出

每个竖式共八行,:(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点,也就是说注意每行的域宽)
第一行:<编号>,编号为1~n(竖式的总数);
第二行:..abc,两空格+三位数abc
(域宽为5)
第三行:X..de,X+两空格+二位数de
(域宽为5)
第四行::-----,五个“-”;
第五行:.abc*e,空格+abc*e的结果
(域宽为5)
第六行:abc*d,空格+abc*d的结果
(域宽为4)
第七行:-----,五个“-”;
第八行:abc*de(域宽为5);
(第2~n个竖式,每个竖式之间空一行)
最后一行:The number of solutions=n;n为竖式总数。

没有满足要求的竖式,输出The number of solutions=0

样例输入

6789

样例输出

<1>
  986
X  88
-----
 7888
7888
-----
86768

<2>
  997
X  77
-----
 6979
6979
-----
76769

<3>
  997
X  78
-----
 7976
6979
-----
77766

The number of solutions=3

提示


本题的解题策略是尝试所有的abc和de,判断是否满足条件。写出如下的伪代码:







 for(abc = 111; abc <= 999; abc++)



   for(de = 11; de <= 99; de++)



     if(“abc*de”是个合法的竖式) {



       printf("<%d>\n", ++count);



       打印abc*de的竖式和其后的空行



     }



  printf("The number of solutions = %d\n", count);


关键在于如何判断“abc*de”是个合法的竖式?



首先计算第一行乘积x=abc*e,然后是第二行y=abc*d,最后是总乘积z=abc*de,将abc, de, x, y, z这五个整数放入到一个字符串中:sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z),接下来可能用strchr函数检查这五个整数是否符合要求。









来源

[提交][状态]