【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个字符否则用空格补齐。
标签:字符,abc,OI,输出,竖式,空格,字符串,解答 来源: https://www.cnblogs.com/nowonder/p/vertical-type.html