2016年清华软院保研机试第1题(C++高精度)

机考题一

• 20 分, LeetCode easy 档次

• 从控制台输入一个合法数字,打印其立方

• 例如

• 输入123456789

• 输出1881676371789154860897069

• 基本编码能力、消耗时间

--------------------------------------------------------------------------------

思路

C++ 高精度。竖式实现乘法和加法(乘法的竖式实现要利用到加法)。

注意:memcpy(char * Dst, char * Src, int size_t),其中size_t是number of bytes(字符的个数),用strlen(Src),不能用sizeof(Src),sizeof(Src)计算的是开辟Src占用的总的byte数。

--------------------------------------------------------------------------------

代码

#include
#include
#include

void add(char *res, char *m1, char *m2)
{
	int len1 = strlen(m1), len2 = strlen(m2), i1, i2, j, n1, n2, s = 0, si = 0;
	if (len1 == 0)
	{
		memcpy(res, m2, strlen(m2));
	}
	else if (m2 == 0)
	{
		memcpy(res, m1, strlen(m1));
	}
	else
	{
		i1 = len1 - 1;
		i2 = len2 - 1;
		j = 0;
		while (i1 >= 0 && i2 >= 0)
		{
			n1 = m1[i1--] - '0';
			n2 = m2[i2--] - '0';
			s = (n1 + n2 + si) % 10;
			si = (n1 + n2 + si) / 10;
			res[j++] = s + '0';
		}
		while (i1 >= 0)
		{
			n1 = m1[i1--] - '0';
			s = (n1 + si) % 10;
			si = (n1 + si) / 10;
			res[j++] = s + '0';
		}
		while (i2 >= 0)
		{
			n2 = m2[i2--] - '0';
			s = (n2 + si) % 10;
			si = (n2 + si) / 10;
			res[j++] = s + '0';
		}
		if (si)
		{
			res[j++] = si + '0';
		}
		std::reverse(res, res + strlen(res));
	}
}

void multiply(char *res, char *m1, char *m2)
{
	int len1 = strlen(m1), len2 = strlen(m2), i1, i2, j, n1, n2, s = 0, si = 0;
	char tmp[315] = {}, res2[315] = {};
	for (i2 = len2 - 1; i2 >= 0; i2--)
	{
		memset(tmp, 0, sizeof(tmp));
		memset(tmp, '0', sizeof(char) *  (len2 - 1 - i2));
		j = len2 - 1 - i2;
		si = 0;
		for (i1 = len1 - 1; i1 >= 0; i1--)
		{
			n1 = m1[i1] - '0';
			n2 = m2[i2] - '0';
			s = (n1 * n2 + si) % 10;
			si = (n1 * n2 + si) / 10;
			tmp[j++] = s + '0';
		}
		if (si)
		{
			tmp[j++] = si + '0';
		}
		std::reverse(tmp, tmp + strlen(tmp));
		if (strlen(res) != 0)
		{
			memcpy(res2, res, strlen(res));
		}
		else
		{
			res2[0] = '\0';
		}
		add(res, res2, tmp);
	}
}

int main()
{
	char st[105] = {};
	char s1[210] = {};
	char ans[315] = {};
	scanf("%s", st);
	if (st[0] != '-')
	{
		multiply(s1, st, st);
		multiply(ans, st, s1);
		printf("%s", ans);
	}
	else
	{
		char * ss = st + 1;
		multiply(s1, ss, ss);
		multiply(ans, ss, s1);
		printf("-%s", ans);
	}
	return 0;
}

 

你可能感兴趣的:(保研机试,清华大学软件学院保研机试经验)