C++招聘编程练习题2

题目一:

现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 … …)之乘积等于n,若不存在则输出 -1。

解题思路:

本题是将正整数n因数分解,且分界的因数应小于10。基于这样的考虑,我首先将正整数n用2,3,5,7四个质数分解。再按33, 222, 23, 2*2的先后顺序将这些质数因数进行合成,最后输出结果。

代码:

int factor_count[8] = { 0 }; // 2, 3, 4, 5, 6, 7, 8, 9

void breakDown(int n, int m)
{
	// m = {2, 3, 5, 7}; index = {0, 1, 2, 3}
	while (n % m == 0)
	{
		n /= m;
		factor_count[m-2] ++;
	}
}

void combine() 
{
	// 2*2, 2*3, 2*2*2, 3*3
	while (factor_count[1] >= 2)
	{
		factor_count[7] ++;
		factor_count[1] -= 2;
	}

	while (factor_count[0] >= 3)
	{
		factor_count[6] ++;
		factor_count[0] -= 3;
	}

	while (factor_count[0] >= 1 && factor_count[1] >= 1)
	{
		factor_count[4] ++;
		factor_count[0] --;
		factor_count[1] --;
	}

	while (factor_count[0] >= 2)
	{
		factor_count[2] ++;
		factor_count[0] -= 2;
	}
}

int solution(int n)
{
	int i, result = 0;
	breakDown(n, 2);	
	breakDown(n, 3);
	breakDown(n, 5);
	breakDown(n, 7);
	if (factor_count[0] + factor_count[1] + factor_count[3] + factor_count[5] == 0) {
		return -1;
	}

	combine();
	for (i = 0; i < 8; i++) {
		while (factor_count[i] > 0)
		{
			result *= 10;
			result += i + 2;
			factor_count[i] --;
		}
	}

	if (result <= 9)
		return -1;

	return result;
}

题目二:

在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。
假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 … …
以此类推,请编程计算出第n天总共可以量产的手机数量。

代码:

int solution(int n)
{
	// x^2 + x + 2 * n <= 0
	int end, i;
	int result = 0, temp;
	end = (sqrt(1 + 8 * n) - 1) / 2;
	for (i = 0; i <= end + 1; i++) {
		temp = n - i;
		if (temp >= 0) {
			result += i * i;
			n -= i;
		}
		else {
			result += n * i;
			n = 0;
		}
	}
	return result;
}

你可能感兴趣的:(C语言)