我是靠谱客的博主 明理小熊猫,最近开发中收集的这篇文章主要介绍《网易游戏2017互娱》实习笔试编程一:竖式填空,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目介绍:

[编程|100分] 竖式填空
时间限制:1秒
空间限制:65536K
题目描述
小Q是名小学生,他最喜欢数学中的加法竖式填空了。例如下面的填空题,每个空格表示1…9中的一个数字。

有时候这种竖式题不一定只有唯一解,小Q很想知道,给定一个这样的竖式,总共可能的解有多少个。
被加数和加数的位数不会超过3位。和的位数不会超过4位。空格只可能存在于被加数和加数中。

输入描述:
每个输入数据包含多个测试点。
第一行为测试点的个数T(T<=30)。
每个测试点包含一行,包含了三个长度大于0的字符串,分别表示被加数,加数和结果。每个字符串之间有一个空格。每个字符串只会包含“X”和“1”…“9”,其中“X”表示竖式中的空格。保证竖式至少有一个解。

输出描述:
对于每个测试点,输出一行,表示一共可能的解的个数。

输入例子:
2
X7 9X 123
X X 4

输出例子:
1
3
(样例解释:样例1的解为27+96,样例2的解为1+3,2+2,3+1。)

思路

先标记出未知位在每个数中的位置,等式左边先求出已知位的和,等式右边是已知数据。用递归,对每个未知位,依次取0~9,然后递归取下一个未知位。注意最高位不能为0。

代码

//
// Created by huxijie on 17-3-11.
// 竖式填空

#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;


void calculate(int j,int xArray[],int mark,int &tmpLeftResult,int &tmpXCount,int counts[],int i,int rightResult);



int main() {
    int n;
    cin>>n;

    int counts[n];  //每个式子的解法个数
    string str[2];  //存放加数和被加数
    int leftResult = 0;     //等式左边的和
    int rightResult = 0;    //等式右边的和
    int xCounts = 0;        //X的个数
    int xArray[6];               //存放未知位X的位置
    int mark = 10;          //用来标记X是最高位
    stringstream stream;


    for(int i=0;i<n;i++) {
        counts[i] = 0;
        leftResult  = 0;
        rightResult  = 0;
        xCounts  = 0;
        for(int j=0;j<2;j++) {
            cin>>str[j];
            int length = str[j].length();   //整个数的位数
            for(int k=0;k<length;k++) {     //从最高位开始判断是否是X
                if (str[j][k] == 'X') {
                    if (k != length - 1) {
                        xArray[xCounts ] = length - k;  //在这个数中X是第几位
                    } else {                      //表示是最高位
                        xArray[xCounts ] = length - k + mark ;    //通过加上10来标记
                    }
                    xCounts ++;
                }else {
                    int tmp;
                    stream<<str[j][k];
                    stream>>tmp;
                    leftResult  += tmp*pow(10,length-k-1);
                    stream.clear();
                }
            }
        }

        cin>>rightResult ;
        int tmpLeftResult = leftResult;
        int tmpXCount = xCounts ;
        calculate(0,xArray,mark ,tmpLeftResult,tmpXCount,counts,i,rightResult );
    }

    for(int i=0;i<n;i++) {
        cout<<counts[i]<<endl;
    }

    return 0;

}

void calculate(int j,int xArray[],int mark,int &tmpLeftResult,int &tmpXCount,int counts[],int i,int rightResult){
    if (tmpXCount>0) {
        if (xArray[j] > mark ) {      //该X是最高位,最高位不能是0
            for (int m = 1; m <= 9; m++) {
                tmpLeftResult += m * pow(10, xArray[j]-mark  - 1);
                tmpXCount--;
                if (tmpLeftResult > rightResult ) {
                    tmpLeftResult -= m * pow(10, xArray[j]-mark  - 1);
                    tmpXCount++;
                    return;
                } else if (tmpLeftResult == rightResult  && tmpXCount == 0) {
                    counts[i]++;
                    tmpXCount++;
                    tmpLeftResult -= m * pow(10, xArray[j]-mark  - 1);
                    return;
                } else if (tmpLeftResult < rightResult  && tmpXCount > 0) {
                    calculate(++j, xArray, mark , tmpLeftResult, tmpXCount, counts, i, rightResult );
                    j--;
                    tmpLeftResult -= m * pow(10, xArray[j] - mark  - 1);
                    tmpXCount++;
                } else {
                    tmpLeftResult -= m * pow(10, xArray[j]-mark  - 1);
                    tmpXCount++;
                }
            }
        }else {
            for (int m = 0; m <= 9; m++) {
                tmpLeftResult += m * pow(10, xArray[j] - 1);
                tmpXCount--;
                if (tmpLeftResult > rightResult ) {
                    tmpLeftResult -= m * pow(10, xArray[j] - 1);
                    tmpXCount++;
                    return;
                } else if (tmpLeftResult == rightResult  && tmpXCount == 0) {
                    counts[i]++;
                    tmpXCount++;
                    tmpLeftResult -= m * pow(10, xArray[j] - 1);
                    return;
                } else if (tmpLeftResult < rightResult  && tmpXCount > 0) {
                    calculate(++j, xArray, mark , tmpLeftResult, tmpXCount, counts, i, rightResult );
                    j--;
                    tmpLeftResult -= m * pow(10, xArray[j] - 1);
                    tmpXCount++;
                } else {
                    tmpLeftResult -= m * pow(10, xArray[j] - 1);
                    tmpXCount++;
                }
            }
        }

    }else {
        calculate(++j, xArray, mark , tmpLeftResult, tmpXCount, counts, i, rightResult );
    }
    return;
}

最后

以上就是明理小熊猫为你收集整理的《网易游戏2017互娱》实习笔试编程一:竖式填空的全部内容,希望文章能够帮你解决《网易游戏2017互娱》实习笔试编程一:竖式填空所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部