OJ编程
-
1、杨辉三角的变形
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;
}
-
2、超长正整数相加
请设计一个算法完成两个超长正整数的加法。
解:由于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;
}
}
-
3、源代码地址
戳标题参考源代码