结束繁忙的毕业季,总结了一波面试笔试的经验,下面分享一些遇到过的笔试题目:
整数分解
题目描述:
一个正整数有可能可以被表示为n(n>;=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。
输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。
样例输入输出:
例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
对于16,其输出结果是:
NONE
[plain] view plain copy
#include
int main(int argc, char *argv[])
{
int n;
int i,j,k;
int flag = 0;
printf("请输入一个大于等于2的正整数:");
scanf("%d", &n);
for (i = 1; i <= n/2; i++)
{
for(j=i+1; j<=n/2+1; j++)
{
if((i+j)*(j-i+1)/2 == n)
{
flag = 1;
for(k = i; k <= j; k++)
{
printf("%2d", k);
}
printf("\n");
}
}
}
if(!flag)
{
printf("NONE\n");
}
return 0;
}
运行结果:
[zzx@localhost test1]$ ./suanfa
请输入一个大于等于2的正整数:16
NONE
[zzx@localhost test1]$ ./suanfa
请输入一个大于等于2的正整数:15
1 2 3 4 5
4 5 6
7 8
[zzx@localhost test1]$
一个二维数组以顺时针螺旋的方式打印出来
- 例如,对数组:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
- 打印出来的序列应该是:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
[plain] view plain copy
#include
int main(int argc, char *argv[])
{
int a[4][5] = {{1,2,3,4,5},{14,15,16,17,6},{13,20,19,18,7},{12,11,10,9,8}};
//int a[3][3] = {{1,2,3},{8,9,4},{7,6,5}};
int left=0, right=4;
int low=0, high=3;
int i;
while((left=left; i--)
{
printf("%d,", a[high][i]);
}
high--;
for(i=high; i>=low; i--)
{
printf("%d,", a[i][left]);
}
left++;
}
printf("\n");
return 0;
}
输出如下:
[zzx@localhost test1]$ gcc b.c -o b
[zzx@localhost test1]$ ./b
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
[zzx@localhost test1]$
strcpy函数的实现:
[plain] view plain copy
int mystrcmp(const char *s1, const char *s2)
{
// assert((s1 != NULL)&&(s2 != NULL));
while((*s1 != '\0')&&(*s2 != '\0')&&(*s1 == *s2))
{
s1++;
s2++;
}
if((*s1 == '\0') && (*s2 == '\0'))
{
return 1;
}
else
{
return -1;
}
}
memcpy函数实现(考虑到内存重叠情况):
[plain] view plain copy
void *mymemcpy(void *dst,const void *src, size_t size)
{
char *psrc;
char *pdst;
assert((dst != NULL)&&(src != NULL));
if((src < dst)&&(char *)src + size > (char *)dst)
{
psrc = (char *)src + size - 1;
pdst = (char *)dst + size - 1;
while(size--)
{
*pdst-- = *psrc--;
}
}
else
{
psrc = (char *)src;
pdst = (char *)dst;
while(size--)
{
*pdst++ = *psrc++;
}
}
return dst;
}
统计二进制数据中1的个数:
[plain] view plain copy
int number(unsigned int x)
{
unsigned int countx = 0;
while (x)
{
countx++;
x = x&(x-1);
}
return countx;
}
统计二进制数据中0的个数:
[plain] view plain copy
int number(int x)
{
int countx = 0;
while (x+1)
{
countx++;
x = x|(x+1);
}
return countx;
}
判断大小端字节序:
[plain] view plain copy
#include
int main(int argc, char *argv[])
{
short int x = 0x1234;
char *p =(char*)&x;
if(*p == 0x12)
{
printf("大端字节序\n");
}
if(*p == 0x34)
{
printf("小端字节序\n");
}
return 0;
}
memcpy函数实现:注意参数是void*类型,拷贝完后面不加'\0';
[plain] view plain copy
void *mymemcpy(void *dest, const char *src, size_t num)
{
assert((dest != NULL) && (src != NULL));
byte *psrc = (byte *)src;
byte *pdst = (byte *)dest;
while(num-- > 0)
{
*pdest++ = *psrc++;
}
return dest;
}
更多学习资料请私聊小编,或者加群710520381,邀请码:柳猫,大家相互讨论哦