声明:这些题目都是从互联网上搜集而来,有些解法属于原创,有些解法属于网友
的智慧,从博客上找来的解法都会给出链接,论坛上的讨论就不给出链接了。
1. 不用中间变量,实现strlen函数。(strlen为C语言中求给字符串长度库函数)
int strlen(const char *str)
解法比较明显,不让用临时变量,那就用递归了。
2. 写一个函数,找出一个数组中第二大的数,复杂度o(n)
3. 输出一个形如下面的数字矩阵(N=4)
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
此题的关键是找出其数学规律。源代码如下:
for(j=i+1;j <N-i;j++)
a[j][N-i-1] = n++;
for(j=N-i-2;j>i;j--)
a[N-i-1][j] = n++;
for(j=N-i-1;j>i;j--)
a[j][i] = n++;
}
for(i=0;i <N;i++){
printf("/n");
for(j=0;j <N;j++)
printf("%5d",a[i][j]);
}
printf("/n");
return 0;
}
4.输出如下蛇行整数矩阵
N = 3:
7 8 9
6 1 2
5 4 3
N = 4:
7 8 9 10
6 1 2 11
5 4 3 12
17 16 15 13
源代码实现:
int main()
{
int n ;
while(cin>>n)
{
int i;
int **a = new int*[n];
for(int t=0;t<n;t++)
a[t] = new int[n];
for(i=0; i<n;i++)
{
for(int j=0; j<n;j++)
a[i][j] = 0;
}
int j;
int di;
int dj;
if(n %2 != 0)
{
i=0;
j=n-1;
di=0;
dj=-1;
for(int it = n*n; it>=1; it--)
{
a[i][j]=it;
if(i+di>n-1||j+dj>n-1||j+dj<0||i+di<0||a[i+di][j+dj])
{
dj = -dj;
swap(di,dj);
}
i+= di;
j+= dj;
}
}
else
{
i=n-1;
j=0;
di= 0;
dj= 1;
for(int it = n*n; it>=1; it--)
{
a[i][j]=it;
if(i+di>n-1||j+dj>n-1||j+dj<0||i+di<0||a[i+di][j+dj])
{
dj = -dj;
swap(di,dj);
}
i+= di;
j+= dj;
}
}
for(i= 0; i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(3)<<a[i][j];
cout<<endl;
}
cout<<endl;
delete []a;
}
return 0;
}
5. 螺旋数字队列
21 22 ……
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
以数字1为原点,X轴向右为正,y轴向上为正,建立数轴
那么数字2的坐标为(1,0),数字9的坐标为(1,1),数字5的坐标为(-1,-1)
现在编程实现输入一点(x,y),输出这点在数轴上对应的值
解析:
1.通过计算给定点(x,y)的坐标先计算出此点所在的圈
2·计算这个圈四个角上的顶点的数值跟坐标
3·比较给定点与这四个顶点的坐标,根据这四个顶点的数值计算给定点的数值
源代码:
struct MyPoint
{
int x;
int y;
int value;
MyPoint(int x, int y, int value)
{
this->x = x;
this->y = y;
this->value = value;
}
};
int FindValue(int x,int y)
{
int len = abs(x) > abs(y) ? abs(x):abs(y);
int val = (len*2+1)*(len*2+1);
MyPoint A(len,len,val);
MyPoint B(-len,len,val-len*2);
MyPoint C(-len,-len,val-len*2*2);
MyPoint D(len,-len,val-len*2*3);
//点落在A,B两点间,包括A,B
if(x <= A.x && x >= B.x && y == len)
return A.value - len + x;
//点落在B,C两点间,包括B,C
if(y <= B.y && y >= C.y && abs(x) == len && x < 0)
return B.value - len + y;
//点落在C,D两点间,包括C,D
if(x <= D.x && x >= C.x && abs(y) == len && y < 0)
return C.value - len - x;
//点落在A,D两点间,包括A,D
if(y <= A.y && y >= C.y && x == len)
return D.value - len - y;
return -1;
}
int main()
{
printf("%d /n",FindValue(-2, 1)); //20
printf("%d /n",FindValue( -2,-1)); //18
printf("%d /n",FindValue( 2, 1)); //10
printf("%d /n",FindValue( 2, -1)); //12
printf("%d /n",FindValue(-1, 2)); //22
printf("%d /n",FindValue( -1, -2)); //16
printf("%d /n",FindValue( 1, 2)); //24
printf("%d /n",FindValue( 1, -2)); //14
return 0;
}
6. 写出atol的实现代码
return total;
}
int main()
{
char s[] = "-54321";
printf("%d /n",atol(s));
return 0;
}
7:写一个函数foo: (从Ponba的讨论组里看到这个题,觉得挺有意思的)
void foo(int i, int j)
{
... //
打印出i到j之间的所有整数。不用任何循环和递归语句。
int dummy::m_i;
void foo(int i, int j)
{
dummy start(i);
new dummy[j-i+1];
}
void foo2(int i, int j)
{
flag:
if (i < j) {
printf("%d ", i++);
goto flag;
}
printf("%d/n", j);
}
int main()
{
foo(5,9);
cout << endl;
foo2(5,9);
return 0;
}