杨辉三角的变形&&-超长正整数相加

OJ编程

                       1

                1     1    1

         1     2     3    2    1

     1    3    6    7    6    3    1

1   4   10  16  19   16   10    4    1

以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。

解:这道题我的想法是,只要计算出第 n 行这一组数,就可以知道第一个偶数的位置的。可以看下面的图:

其实每一行的个数都是其 行数 * 2 - 1个(如:第二行的个数是 3 个,第 4 行的个数是7个),于是我们就知道最后一行的个数就是 2 * n - 1。而且第一个数和最后一个数都是 1。于是创建一个vector为2 * n - 1个大小,然后从第一行开始计算,就可以得到第 n 行的数据。

	v1[mid] = 1;//第一行的中间下标是 1
	for (int i = 0; i < n; ++i)//从第一行开始计算
	{
		for (int j = 1; j < tmp - 1; ++j)
		{
			v2[j] = v1[j - 1] + v1[j] + v1[j + 1];

		}
		v1 = v2;
	}

请设计一个算法完成两个超长正整数的加法。

解:由于C++里没有大数运算,但是我们在其他地方可以借助boost大数库来计算。而作为OJ题是不能用第三方库的,所以我们可以用字符串来进行计算。加法和前面写过的加法运算一样,两个数当前位的值,加前两位之和的进位。

	for ( i ; i < size3; ++i)//size3是短的那个字符串的长度
	{
		int s1 = str1[i] - '0';
		int s2 = str2[i] - '0';
		int sum = s1 + s2 + flag;
		res += (sum % 10) + '0';
		if (sum > 9)
		{
			flag = 1;
		}
		else
		{
			flag = 0;
		}
	}

戳标题参考源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值