作业111

作业

int cnt=0;
int fib(int n){
cnt++;
if(n==0)
return 1;
else if(n==1)
return 2;
else
return fib(n-1)+fib(n-2);
}
void main( ){
fib(8);
printf("%d" , cnt);}

明白这个变量是在干什么,不要蛮算,cnt实际在统计:斐波那契递归总的次数
F0递归1次,F1递归1次
F2: F0+F1=递归3次。F3: F2+F1=5,F4:F3+F2=1+5+3=9,F5:F4+F3=1+9+5=15,F6: F5+F4=1+15+9=25,F7: F6+F5=1+25+15=41,F8: F7+F6=1 +41 +25 = 67

码云使用

45846 --Fibonacci数列

添加链接描述
F(n) = F(n - 1) + F(n - 2)。f = 斐波那契数 = 0,1, 1, 2, 3, 5, 8,13,若N = 10,f = 8 = 13,10 - 8 = l, 13 - 10 = r,

#include <iostream>
using namespace std; 
int main(){
	int N, f, l = 0, 
		r = 0, f0 = 0, f1 = 1;
	cin >> N; 
	while (1)
	{	f = f0 + f1; f0 = f1; f1 = f; 
		if(f < N)//找到比N小且距离N最近的数,求出距离
			l = N-f; 
		else {
			//找到比N大且距离N最近的数,求出距离 
			r = f - N;
		break;
			}
	} //取最小距离
		cout << min(l, r) << endl; 
		return 0;
}

3.矩阵的每行从左到右是递增的,矩阵从上到下是递增的,查找某个数字是否存在。时间复杂度小于O(N)

int FindData(int arr[][4], int row,int col, int target){
int i = 0;
int j = col - 1;//右上角
while (i<row && j >= 0){
if (target > arr[i][j])
i++;
else if (target < arr[i][j)
j--;
else{
return 1;
}
}
return 0;
}
int main(){
int arr[][4] = {
{ 1234 }{ 5,6, 7,8 }{ 9,101112},{13,1415, 16 }};
int target = 1://查找本质是“排除”[比较]
int res = FindData(arr,44,target) ;
printf("exist: %d\n", res); }

函数形参实例化:从右到左。凡是向显示器中打印的内容,全部都是字符;凡是键盘中输入的内容全部都是字符;显示器和键盘被称之为字符设备;printf、scanf:格式化;puts:非格式化;strtok:分割字符串,摒弃空串"",只会获取有效字符串;一个返回值,一次只能拿一个字符串地址;strtok需要多次调用,来进行字符串分割,第二次之后,如果还想分割历史string,参数必须设置为NULL;第2次调这个函数时,还记得上次的字符串:strtok内部有static变量,传入参数非空则初始化,是空则用上次的结果;设置分隔符为\0的方式,进行子串提取;main函数返回值return 0是给系统的,0=成功,错误码=计算机好处理,

4.qsort的功能实现一个通用的冒泡排序:

qsort=无类型排序,对任何类型数据排序,

void myqsort(void * base, size_t nitems, size_t size, int(*compar)(const void *, const void *))
{
	int i, j;
	char * st = (char *)base; //void *不方便加减,用char *加减轻松且字节跳转为1,方便控制。
	char tmp[16]; //考虑到long double类型,临时空间做成16字节比较保险
 
	for (i = 0; i < nitems - 1; i++)
	{
		for (j = 0; j < nitems - 1 - i; j++) //冒泡常用循环头
		{
			if (compar(st + j * size, st + (j + 1) * size)) //比较的时候跳转注意乘size
			{
				memcpy(tmp, st + j * size, size); //交换操作用memcpy完成就不会出问题。
				memcpy(st + j * size, st + (j + 1) * size, size);
				memcpy(st + (j + 1) * size, tmp, size);
			}
		}
	}
}
int main(){
printf("%d\n"printf("%d"printf("43")));
}//结果:4321.链式调用从内向外

在这里插入图片描述

4、写一个函数打印arr整形一维数组的内容,不使用数组下标,使用指针

void ShowArr(int arr[],int num){//方法1
for (int i =0; i < num;i++)//前闭后开区间
printf("%d ",*(arr + i));
}
void ShowArr(int *p,int num){//方法2
int *start =p:
whiel(start < p+num)//指向数组最后一个元素的下一个位置,前闭后开区间:差值:元素个数
printf("%d ”,*start):}
void ShowArr(int  *p,int num){//方法3
for (int i =0; i < num;i++)
printf("%d ",p[i]);
}
int main(){
int arr[]={1098765432);
int num = sizeof (arr) / sizeof (arr[O]);//元素个数
ShowArr (arr,num);}

6、调整数组使奇数全部都位于偶数前面

void  Exchange(int arr[]int num)
{		int left = 0;
	int right = num - 1;
	while (left < right)
	{		//判断奇偶:检测最低比特位=0,即偶数
		while (left < right && (arr[left] & 1))//(arr[left] & 1)是真时,数=奇数
			left++;
		while (left < right && !(arr[right] & 1))
			right--;
		if (left 〈 right){
			arr[left] ^= arr[right];
			arr[right] ^= arr[left];
			arr[left] ^= arr[right];		}
	}
}
int main(){
int arr[]={1098765432);
int num = sizeof (arr) / sizeof (arr[O]);//元素个数
Exchange (arr,num);}

7、模拟实现库函数strcpy拷贝

char*my _strcpy(char *dst,const char *src){
	assert(dst);
	assert(src);
	char *ret = dst;
	while (*dst++ = *src++);//判断*dst真假,src给dst之后,再++
		return ret;
}
int main(){
			const char *src = "abcd1234xyz"; 
			char dst[32];
		my_strcpy(dst,src);//需要拷贝\0
}

9、求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222

int main(){
	int a = 2;
	int result = 0;
	for (int i = 0; i < 5; i++) {
		int temp = a;
		int j = 0;
		while (j < i){
			temp = temp * 10 + a; 
			j++;
		}
			result += temp;
		printf("=%d\n",result);
	}

10、水仙花数

0~100000之间的所有“水仙花数”并输出。“水仙花数”:一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。

int ExpCount(int x){
	int count = 0; while (x){
		x /= 10;
		count++;
	}
	return count;
}
void ShowFlower(int start, int end){
for (int i = start; i <= end; i++)
 {
	if (IsFlower(i))
		printf("%d ", i);
  }
}
int IsFlower(int x){
int sum = 0; int tmp = x; 
int exp =ExpCount(x) ;//n
while (x){
	sum += (int)pow(x % 10, exp);
	x /= 10;
     }
	return sum == tmp;
}
int main(){
ShowFlower(01000) ;system("pause") ;
return 0;}

11、打印菱形

在这里插入图片描述

void Show(int n){//上半部分
for (int i = 0; i< = n / 2; i++){
	int j = 0;
	for (j = n / 2 - i; j > 0; j--){
		printf("");//输出空格
	}
	for (j = 0; j < 2 * i + 1; j++){
		printf(""*"");
	}
	printf("\n");
}
//下半部分
for (int i = 1; i <= n / 2; i++){
	int j = 0;
	for (; j <i; j++){
		printf("");//输出空格
	}
	for (j = 0; j < n-2 * i ; j++){
		printf(""*"");
	}
	printf("\n");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值