【OI】竖式问题分析与解答

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

解:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 
 5 int main()
 6 {
 7     int count = 0;    //计数器
 8     char s[20],buf[99];
 9     scanf ("%s",s);
10     for (int abc = 111; abc<= 999 ; abc ++) 
11     {
12         for (int de = 11; de <= 99; de ++)
13         {
14             int x = abc * (de % 10) , y = abc * (de/10) , z = abc * de;
15             sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
16             int ok = 1;
17             for (int i =0;i<strlen(buf);i++)
18                 if (strchr(s,buf[i]) == NULL ) ok = 0;
19             if (ok)
20             {
21                 printf("<%d>\n",++count);
22                 printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
23             }
24         }
25     }
26     printf ("the number of the solutions = %d\n",count);
27     return 0;
28 }

 1、获得集合。当然不用数组,因为字符串的查找可以给我们省下很大的功夫。

  这里涉及sprintf函数。查资料:sprintf(字符串数组,格式,内容……)。注意它是一个有返回值的函数。如果写入成功返回写入字符串的个数。如果不成功(溢出)返回负数。经过实验证明,此函数可以理解为覆盖字符串,而不会在原有的字符串后面添加字符。

2、枚举所有可能的竖式:使用双循环。这点没有什么好说的

3、判断竖式是否合法,即判断竖式里面的数字是否属于数组。使用strchr(string.h)函数。strchr(字符串,字符)在字符串里面查找字符,成功返回字符第一次出现的位置(以及以后的字符),反之返回NULL。个人建议这个搜索循环可以用break短路一下。毕竟找到一个不一样就可以不用再往下找了。

4、输出问题,%nd,输出n个字符否则用空格补齐。

猜你喜欢

转载自www.cnblogs.com/nowonder/p/vertical-type.html
今日推荐