[C++] 竖式问题

[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();
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值