网易面试题——分饼干
分类:Interview
题目:
易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值
输入描述:
输入包括两行:
第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位)
第二行为小朋友的人数n
输出描述:
输出k可能的数值种数,保证至少为1
输入例子:
9999999999999X
3
输出例子:
4
分析:
要求任何人数的平均分配,用枚举法对每一个可能的数字进行整除。
算法代码:
int distributeCookies(string & cookies, int students)
{
int numberOfProbobilities = 0;
int numberOfCookies = transformCookies(cookies);
int tempNumberOfCookies;
for (int i = 0; i < 10; ++i) {
tempNumberOfCookies = numberOfCookies + (i * flagOfPosition[0]);
if (averageDistribute(tempNumberOfCookies, students)) {
++numberOfProbobilities;
}
}
return numberOfProbobilities;
}
bool averageDistribute(int tempNumberOfCookies, int students)
{
while (tempNumberOfCookies >= students) {
tempNumberOfCookies -= students;
}
if (0 == tempNumberOfCookies) {
return true;
}
else {
return false;
}
}
int transformCookies(string & cookies)
{
int numberOfCookies = 0;
int n = (int)cookies.size();
for (int i = 0; i < n; ++i) {
if ('X' == cookies[i]) {
flagOfPosition.push_back(pow(10, n-1-i));
}
else {
numberOfCookies += (((int)cookies[i] - 48) * pow(10, n-1-i));
}
}
return numberOfCookies;
}
测试代码:
//
// main.cpp
// distributeCookies
//
// Created by Jiajie Zhuo on 2017/7/3.
// Copyright © 2017年 Jiajie Zhuo. All rights reserved.
//
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
using namespace std;
vector<int> flagOfPosition;
int distributeCookies(string & cookies, int students);
int transformCookies(string & cookies);
bool averageDistribute(int tempNumberOfCookies, int students);
int main(int argc, const char * argv[]) {
string cookies;
cout << "Please enter the cookies: ";
cin >> cookies;
int students;
cout << "Please enter the students: ";
cin >> students;
cout << "The probobilities of number is " << distributeCookies(cookies, students) << endl;
return 0;
}
总结:
枚举法的效率很低,但是要求每一个人数,只能这样求解。
如果有收获,可以请我喝杯咖啡!