题目:
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。
样例输入:2357
样例输出:
<1>
..775
X..33
.2325
2325.
25575
The number of solutions = 1
**分析:
string中 find()的应用 (rfind() 类似,只是从反向查找)
尝试所有的abc和de,判断是否满足条件。
找到 – 返回 第一个字符的索引
没找到–返回 string::npos
**
#include<iostream>
#include<string>
#include<sstream>//用于stringstream转换
using namespace std;
bool conform(int num, string str){
stringstream stream;
string s;
stream << num;
stream >> s;
int len = s.length();
for(int i = 0; i < len; i++){
if(str.find(s[i]) == str.npos){
return 0;
}
}
return 1;
}
int main (){
string str;
cin >> str;
int abc;
int de;
int count = 0;
for(abc = 111; abc < 999; abc++){
for(de = 11; de < 99; de++){
if( conform( abc, str) && conform( de, str)){
int x = abc * (de/10);
int y = abc * (de%10);
if( conform( x, str) && conform( y, str)){
int outcome = abc *de;
if( conform( outcome, str)){
cout << "<" << ++count << ">" << endl;
cout.width(5);
cout.setf(ios::right);
cout << abc << endl;
cout << "X";
cout.width(4);
cout.setf(ios::right);
cout << de << endl;
cout << "-----" << endl;
cout.width(5);
cout.setf(ios::right);
cout << x << endl;
cout.width(4);
cout.setf(ios::right);
cout << y << endl;
cout << "-----" << endl;
cout.width(5);
cout.setf(ios::right);
cout << outcome << endl;
}
}
}
}
} cout << endl;
cout << "The number of solutions = " << count << endl;
}