1、有一百个整数,其中有负数,找出连续三个数之和最大的部分.
示例:
输入:2 ,-8 ,3,-2 ,4,-10
输出: 5 ({3, -2, 4})
首先我们需要去遍历数组才能得到结果,
之后我们就要遍历,从首元素开始,连续三个做一次判断,直到倒数第三个元素为止。所以我们就可以采取下面的措施。
#include <stdio.h>
void fun(int arr[], int n)
{
int i = 0, j = 0, k = 0;
int m = 0, l = 0;
int max = arr[0] + arr[1] + arr[2];
for(m=0; m<n-2; m++)
{
if(((arr[m] + arr[m+1] + arr[m+2]) > max))
{
i = arr[m];
j = arr[m+1];
k = arr[m+2];//保存相邻的三个的最大值的具体值
max = i + j + k;,保存最大值
}
}
printf("%d ({%d,%d,%d})", max, i, j, k);
}
int main(void)
{
int arr[6] = {2,-8,3,-2,4,-10};
fun(arr,6);
return 0;
}
2、用<<,>>,|,&实现一个unsigned short型变量(2个字节)的高低位交换!!
例如:0x1234 交换后 0x3412
函数原型:void func(unsigned short *a)
我们可以定义一个只有一个字节有效的short型。利用它来得到我们想要交换的位数,然后赋值给我们想给的short型变量的中转站。之后再进行或运算得到我们最后的结果。
#include <stdio.h>
int main(void)
{
unsigned short a = 0x1234;
unsigned short b = 0xff;
unsigned short d = 0;
unsigned short e = 0;
printf("a = %x\n", a);
d = a & (b << 8);
e = b & a;
e = e << 8;将e(3400)左移8位变为(3400)
d = d >> 8;//将d(1200)右移8位变为(12)
a = 0; 将a(清零)
a = a | e;//将a与e(3400)或运算得(3400)
a = a | d ;//将a (3400)或运算得(3412)
printf("a = %x\n", a);
return 0;
}
3、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa55。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
/*为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
A more obscure approach is:
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa66;*/
。。。。。不会