前言:此处只记录我遇到的部分编程题,而另一篇文章只记录知识点。
部分知识点记录
http://blog.csdn.net/bestzem/article/details/52434236
给定初始值initVal,行rows,列cols,得到增量矩阵A,求出A*A’,并返回。函数如下:
int **fun(int initVal, int rows, int cols)
{
//write code here
}
eg:3 4 2
3 4
5 6
7 8
9 10
*
3 5 7 9
4 6 9 10
返回
25 39 53 67
39 61 83 105
53 83 113 143
67 105 143 181
主要问题:
1、直接将结果矩阵计算出来,不要间接计算。
2、返回指针的指针(二维矩阵,动态内存)。注意申请方法,和初始化(想不到我竟然卡在了这里)。
pint *r=new pint[rows];
for (int i = 0;i < rows;++i)
{ r[i] = new int[rows]; }
for (int j = 0;j < rows;++j)
{ for (int i = 0;i < rows;++i) { r[j][i]=0; }
}
#include <iostream>
using namespace std;
typedef int *pint;//申请动态二维空间
int **fun(int initVal, int rows, int cols)
{
//write code here
pint *r=new pint[rows];
for (int i = 0;i < rows;++i)
{
r[i] = new int[rows];
}
for (int j = 0;j < rows;++j)
{
for (int i = 0;i < rows;++i)
{
r[j][i]=0;
}
}
for (int j = 0;j < rows;++j)
{
int valOfRow = initVal + j*cols;
for (int i = 0;i < rows;++i)
{
int valOfCol = initVal + i*cols;
for (int k = 0;k < cols;++k)
{
r[j][i] += (valOfRow + k)*(valOfCol + k);
}
}
}
return r;
}
int main()
{
int n = 0, r = 0, c = 0;
while (cin >> n >> r >> c)
{
int **res = fun(n, r, c);
for (int j = 0;j < r;++j)
{
for (int i = 0;i < r;++i)
{
cout << res[j][i];
if (i != r - 1) cout << " ";
}
if (j != r - 1) cout << endl;
}
//delete....
}
}
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3)…….f(N)
例如: N = 7
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
分析:
1、N=7
g(7)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)+f(7)
奇数部分直接为该奇数,先求奇数和
g(7)=1+3+5+7+f(2)+f(4)+f(6)
=(1+7)*((1+7)/2)/2+f(2)+f(4)+f(6)
=16+f(2)+f(4)+f(6)
现在剩下的偶数,每个/2可以得到对的最大约数1、2、3,也就是
g(3)=f(2)+f(4)+f(6)=f(1)+f(2)+f(3)
故:g(7)=奇数和+g(3);
2、N=8
g(7)=f(1)+f(2)+f(3)+f(4)+f(5)+f(6)+f(8)
奇数部分直接为该奇数,先求奇数和
g(7)=1+3+5+7+f(2)+f(4)+f(6)+f(8)
=(1+7)*((1+7)/2)/2+f(2)+f(4)+f(6)+f(8)
=16+f(2)+f(4)+f(6)+f(8)
现在剩下的偶数,每个/2可以得到对的最大约数1、2、3、4,也就是
g(4)=f(2)+f(4)+f(6)+f(8)=f(1)+f(2)+f(3)+f(4)
故:g(7)=奇数和+g(4);
综上:
g(N)=奇数和+g(N/2),而奇数和可以定为:
N为奇数时,(1+N)*((1+N)/2)/2。其中(1+N)/2为个数。
变形为((1+N)/2)*((1+N)/2)如此一来,便也适用于偶数时候。
故:g(N)=((1+N)/2)*((1+N)/2)+g(N/2)
牛客的解题题
http://www.nowcoder.com/discuss/9620
#include <iostream>
using namespace std;
typedef unsigned long long ull;
ull getResult(int n) {
if(n==0) return 0;
return (ull)((n+1)/2)*((n+1)/2)+getResult(n/2);
}
int main() {
int n;
while (cin >> n) {
cout << getResult(n) << endl;
}
}
考完了写的,这次真的是0成功率啊。不知道我现在写对没有,反正给的测试用例通过了。其实思路很简单,就是代码量有点大,还有输入的不确定性太大。我暂时没有比较好的方法处理。另外,我在处理移动的时候暴利移动的,其实可以有点技巧的。此处省略。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int RED = 0, GREEN = 1, BLUE = 2, YELLOW = 3, PURPLE = 4;
int p[10][10] = {
{ RED,RED,BLUE,BLUE,GREEN,YELLOW,BLUE,YELLOW,RED,PURPLE },
{ GREEN,GREEN,GREEN,BLUE,RED,PURPLE,RED,YELLOW,YELLOW,BLUE },
{ BLUE,RED,RED,YELLOW,YELLOW,PURPLE,BLUE,GREEN,GREEN,BLUE },
{ YELLOW,RED,BLUE,YELLOW,BLUE,RED,PURPLE,GREEN,GREEN,RED },
{ YELLOW,RED,BLUE,BLUE,PURPLE,GREEN,PURPLE,RED,YELLOW,BLUE },
{ PURPLE,YELLOW,RED,RED,YELLOW,RED,PURPLE,YELLOW,RED,RED },
{ YELLOW,YELLOW,GREEN,PURPLE,GREEN,RED,BLUE,YELLOW,BLUE,GREEN },
{ RED,YELLOW,BLUE,BLUE,YELLOW,GREEN,PURPLE,RED,BLUE,GREEN },
{ GREEN,GREEN,YELLOW,YELLOW,RED,RED,PURPLE,BLUE,BLUE,GREEN },
{ PURPLE,BLUE,RED,RED,PURPLE,YELLOW,BLUE,RED,RED,GREEN } };
void merge(vector<int> &change)
{
for (int i = 0;i < 10;++i)
{
int count = 0;
for (int j = 0;j < 10;++j)
{
if (change[j * 10 + i] == -1)
{
++count;
}
}
if (count == 10)
{
for (int x = i;x < 9;++x)
{
for (int y = 0;y < 10;++y)
{
change[y * 10 + x] = change[y * 10 + x+1];
}
}
for (int y = 0;y < 10;++y)
{
change[y * 10 + 9] = -1;
}
}
else
{
for (int y = 9;y >= 0;--y)
{
if (change[y * 10 + i] == -1)
{
for (int k = y;k >0;--k)
{
change[k * 10 + i] = change[(k - 1) * 10 + i];
}
change[i] = -1;
}
}
}
}
}
void help(vector<int> &change, const int &val,int op)
{
if (val == -1) return;
int x = op % 10, y = op / 10;
change[op] = -1;
if (x > 0&&change[op-1]==val)//left
{
help(change, val, op-1);
}
if (x < 9 && change[op +1] == val)//right
{
help(change, val, op+1);
}
if (y > 0 && change[op - 10] == val)//up
{
help(change, val, op-10);
}
if (y < 9 && change[op + 10] == val)
{
help(change, val, op + 10);
}
merge(change);
}
void getResult(string &str)
{
vector<int> v(100);
for (int j = 0;j < 10;++j)
{
for (int i = 0;i < 10;++i)
{
v[j*10+i]= p[j][i];
}
}
int op = 0;
int len = str.length();
for (int t=0;t<=len;++t)
{
if (str[t] != ' '&&str[t]!='\0')
{
op = 10 * op + str[t] - '0';
}
else
{
if (v[op] != -1)
{
int val = v[op];
int x = op % 10, y = op / 10;
if (x > 0 && v[op - 1] == val)//left
{
v[op] = -1;
help(v, val, op - 1);
}
if (x < 9 &&v[op + 1] == val)//right
{
v[op] = -1;
help(v, val, op + 1);
}
if (y > 0 && v[op - 10] == val)//up
{
v[op] = -1;
help(v, val, op - 10);
}
if (y < 9 && v[op + 10] == val)
{
v[op] = -1;
help(v, val, op + 10);
}
}
op = 0;
}
}
int a = 0, b = 0, c = 0, d = 0, e = 0;
for (int i = 0;i < 10;++i)
{
for (int j = 0;j < 10;++j)
{
if (v[i * 10 + j] == 0)
++a;
else if (v[i * 10 + j] == 1)
++b;
else if (v[i * 10 + j] == 2)
++c;
else if (v[i * 10 + j] == 3)
++d;
else if (v[i * 10 + j] == 4)
++e;
}
}
std::cout << a << " " << b << " " << c << " " << d << " " << e << endl;
}
int main()
{
string str{""};
while (getline(cin,str))
{
getResult(str);
}
return 0;
}
arr[] = { 1,2,3,4,5,6,7,8,9}, posArray[] = { 5,3,4,2,1,0,6,7,8 }
将arr数组按照posArray给的索引排序,排序结果:6 4 5 3 2 1 7 8 9。
#include <iostream>
using namespace std;
void help(int *array, int *posArray, const int &N, int pos, int i)
{
int pos1 = posArray[pos];
if (pos1 > i)
{
swap(array[pos1], array[i]);
}
else if (pos1<i)
{
help(array, posArray, N, pos1, i);
}
}
void sortByPosArray(int *array, int *posArray,const int &N)
{
for (int i = 0;i <N;++i)
{
int pos = posArray[i];
if (pos > i)
{
swap(array[pos], array[i]);
}
else if(pos<i)
{
help(array, posArray, N, pos, i);
}
//输出步骤
for (int i = 0;i<N;++i)
{
cout << array[i] << "\t";
}
cout << endl;
}
}
int main()
{
const int N = 9;
int arr[] = { 1,2,3,4,5,6,7,8,9}, posArray[] = { 5,3,4,2,1,0,6,7,8 };
sortByPosArray(arr, posArray,N);
for (int i=0;i<N;++i)
{
cout << arr[i] << "\t";
}
cout << endl;
system("pause");
return 0;
}