【题目】:
找出所有形如abc*de(三位整数乘两位整数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。
样例输入:
2357
样例输出:
<1>
775
X 33
-----
2325
2325
-----
25575
The number of solutions = 1
【分析】
题目中的两个乘数已知一个是两位数,一个是三位数,则二者乘积一定不会超过5位,计算出结果之后,输出5位数字,左边为0的用空格不齐。
解决这道题目无非两个思路,一是从所给的数字集合中选择数字组成竖式,而是枚举所有数字组合的乘数,筛去不符合的。看似从较小的数字集合中选取比较节省时间,但是筛选原则不容易确定,在这种情况下,枚举abc和de虽然数量多,但是每次操作都很简单。
#include<stdio.h>
#include<string.h>
int main()
{
int cou =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);
int y=abc*(de/10);
int 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>\n",++cou);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
}
}
printf("The number of solutions = %d\n",cou);
return 0;
}
sprintf(str2,const char* str1)函数将一个字符串str1写进另一个字符串str2,但是由于这个函数没有申明str1的长度,所以有溢出的风险,可以使用snprint()函数来解决,此函数中增加了一个int size的变量,size=strlen(str1)。
或者用一个可变大小的buffer——Java版:
public static void main(String[] args) {
int cou=0;
String s;
Scanner scanner = new Scanner(System.in);
s=scanner.next();
for(int abc=111;abc<=999;abc++)
for(int de=11;de<=99;de++) {
StringBuffer stringbuffer = new StringBuffer();
int x=abc*(de%10),y=abc*(de/10),z=abc*de;
stringbuffer.append(x);
stringbuffer.append(y);
stringbuffer.append(z);
stringbuffer.append(abc);
stringbuffer.append(de);
boolean ok=true;
for(int i=0;i<stringbuffer.length();i++)
if(s.indexOf((int)stringbuffer.charAt(i))==-1)
ok=false;
if(ok)
{
System.out.println("<"+ ++cou +">");
System.out.printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n",abc,de,x,y,z);
}
}
System.out.printf("The number of solutions = %d\n",cou);
}
如有错误,恳请指出~