一.问题描述:
找出所有形如“abc*de”(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
二. 问题分析:按竖式计算的步骤各自计算,并将过程中算出的数得到一个数字集合ele,遍历ele并与原集合all对比,保证ele是all的子集
关键步骤:
①sprintf()函数
②strchr()函数
三.代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char all[20],ele[100]; 6 int cnt; 7 scanf("%s",all); 8 for(int abc=111;abc < 999;abc ++){ 9 for(int de=11;de < 99;de ++){ 10 int x = abc*(de%10),y = abc*(de/10),z = abc*de; 11 sprintf(ele,"%d%d%d%d%d",abc,de,x,y,z); 12 13 int ret=1;//用来判断是否输出的基准 14 for(int i=0;i < strlen(ele);i ++){ 15 if(strchr(all,ele[i])==NULL)//但凡有不在原集合中的元素... 16 ret=0; 17 } 18 if (ret){ 19 printf("<%d>\n",++cnt); 20 printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z); 21 } 22 } 23 } 24 printf("The number of solutions is %d\n",cnt); 25 return 0; 26 }