C.0419

1.编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值value的二进制位模式从左到右翻转后的值。
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832

#include <stdio.h>
#include <stdlib.h>

unsigned int round(unsigned n)
{
	int i;
	unsigned int tmp, sum = 0;
	for (i = 0; i < 32; i++, n /= 2)
	{
		tmp = n % 2;
		sum = sum * 2 + tmp;
	}
	return sum;
}

int main()
{
	printf("%u\n", round(25));

	int n = 15;
	int i, tmp, sum = 0, sn = 2;
	for (i = n; i; i /= sn)
	{
	tmp = i % sn;
	sum = sum * sn + tmp;
	}
	system("pause");
	return 0;
}

2.不使用(a + b) / 2这种方式,求两个数的平均值

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	int p = a - (a - b) / 2;
	printf("%d\n", p);
	system("pause");
	return 0;
}

3.编程实现:
一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
请找出这个数字。(使用位运算)

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[10] = { 1, 5, 2, 3, 4, 1, 6, 3, 4, 2 };
	int i;
	int sum = 0;

	for (i = 0; i < 9; i++)
	{
		sum ^= a[i];
	}

	int pos;
	for (i = 0; i < 32; i++)
	{
		if (sum & 1 << i)
		{
			pos = i;
			break;
		}
	}

	int num1 = 0, num2 = 0;
	for (i = 0; i < 10; i++)
	{
		if (a[i] & 1 << pos)
		{
			num1 ^= a[i];
		}
		else
		{
			num2 ^= a[i];
		}
	}
	printf("%d %d\n", num1, num2);
	system("pause");
	return 0;
}

4.有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:不能使用库函数;只能开辟有限个空间。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverse_string(char * str, int i, int j)
{
	char tmp;

	for (; i < j; i++, j--)
	{
		tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	}}

void reverse_word2(char * str)
{
	int i;
	int start = 0, end = 0;

	for (i = 0; str[i]; i++)
	{
		if (str[i] == ' ')
		{
			end = i - 1;
			reverse_string(str, start, end);
			start = i + 1;
		}
	}
	reverse_string(str, start, i - 1);
	reverse_string(str, 0, i - 1);
}

void reverse_word(char * str)
{
	char tmp[256] = { 0 };
	char * p;

	while (p = strrchr(str, ' '))
	{
		strcat(tmp, p + 1);
		strcat(tmp, " ");
		*p = 0;
	}
	strcat(tmp, str);
	strcpy(str, tmp);
}

int main()
{
	char str[] = "I am a student";
	reverse_word(str);
	puts(str);
	reverse_word2(str);
	puts(str);
	system("pause");
	return 0;
}
这段代码实现了以下功能: 1. 使用反幂法求解一个矩阵的最小特征值和对应的特征向量。 2. 构造一个状态空间模型,包括系统的状态方程、输入方程、输出方程和零输入响应。 3. 根据状态空间模型和初始状态、输入信号,预测了未来某个时间点的系统输出。 具体解释如下: 1. 首先,定义了一个 $4\times 4$ 的矩阵 `stocks`,表示股票价格矩阵。使用反幂法求解该矩阵的最小特征值和对应的特征向量,即求解一个形如 $Ax=\lambda x$ 的问题,其中 $A$ 为 `stocks`,$x$ 为特征向量,$\lambda$ 为最小特征值。求解过程中,使用了迭代的方法,通过不断迭代矩阵乘法和归一化操作,得到收敛的特征向量和最小特征值。 2. 定义了一个状态空间模型 `sys`,其中 $A$、$B$、$C$ 和 $D$ 分别表示状态方程、输入方程、输出方程和零输入响应。状态方程的系数矩阵 $A$、输入矩阵 $B$ 和输出矩阵 $C$ 分别为给定的矩阵,而零输入响应为常数 $0$。该模型描述了一个三维系统,其中输入为标量,输出为一个三维向量。 3. 构造了一个初始状态向量 `x0` 和一个输入信号 `u`,并定义了一个时间向量 `t`。调用了 Matlab 中的 `forecast` 函数,根据状态空间模型、初始状态、输入信号和时间向量,预测了未来某个时间点的系统输出。其中,`y` 表示预测的输出结果,`tsim` 表示时间向量,`x` 表示系统的状态向量。最后,输出了预测的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值