[C++] 竖式问题
题目
找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但所写程序中应该输出空格,而非小数点)。
样例输入:
2357
样例输出:
<1>
…775
X…33
.2325
25575
The number of solutions = 1
分析
首先是把输入数据存在一个数组str[n]里,然后用里面的元素遍历组成一个三位数a,b,c和一个两位数d,e,然后在竖式中会产生三个结果str1,str2和结果res,如例子中的2325,2325,25575。再判断这三个结果的元素是否全在数组里,如果是,输出格式,如果不是,继续下一次循环。
其中有一个累加器cot记录结果的数量。
代码实现
#include <iostream>
#include <iomanip> //使用setw()设置输出格式
#include <cstring> //strlen求长度
#include <string> //str.length()求长度
#include <sstream> //使用stringstream将数字转化为字符串
using namespace std;
bool ifNot(char s[20], string str); //如果字符串str中有元素不在数组里,返回true
string toString(int a); //将int整型转化为字符串
int main()
{
char str[20];
cin>>str;
int n = strlen(str), cot = 1; //初始化
bool success;
for(int i = 0; i < n; i++) //三位数百位i
{
for(int k = 0; k < n; k++) //三位数十位k
{
for(int h = 0; h < n; h++) //三位数个位h
{
//确定三位数num1
int num1 = int(str[i] - '0') * 100 + int(str[k] - '0') * 10 + int(str[h] - '0');
for(int m = 0; m < n; m++) //两位数十位m
{
for(int q = 0; q < n; q++) //两位数个位q
{
success = true;
string str1, str2, res;
str1 = toString(num1 * int(str[q]-'0'));
str2 = toString(num1 * int(str[m]-'0'));
res = toString((num1 * int(str[m]-'0'))*10+num1 * int(str[q]-'0'));
if(ifNot(str,str1)||ifNot(str,str2)||ifNot(str,res))
{
success = false;
}
if(success == true) //按格式输出
{
cout<<"<"<<cot<<">"<<endl<<endl;
cout<<" "<<str[i]<<str[k]<<str[h]<<endl<<"X "<<str[m]<<str[q]<<endl<<"------"<<endl;
cout<<setw(5)<<str1<<endl;
cout<<setw(4)<<str2<<endl<<"-----"<<endl<<res<<endl;
cout<<endl;
cot++;
}
}
}
}
}
}
cout<<"The number of solutions = "<<cot-1<<endl;
return 0;
}
bool ifNot(char s[20], string str)
{
bool is = false;
for(int i = 0; i < str.length(); i++)
{
for(int k = 0; k < strlen(s); k++)
{
if(str[i]==s[k])
is=true;
}
if(is==false)
return true;
is=false;
}
return false;
}
string toString(int a)
{
stringstream ss;
ss<<a;
return ss.str();
}