练习--指针基础算法题

1、写一个函数打印arr数组的内容,不使用数组下标,使用指针。

arr是一个整形一维数组。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

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

void PrintArr(int *p,int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", *(p + i));
	}
}

int main()
{
	int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int *p = arr;
	PrintArr(p, len);
}

2、写一个函数,可以逆序一个字符串的内容。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//#include <string.h>

//写一个函数,可以逆序一个字符串的内容。

int Reverse(char *arr,int len)
{
	char *left = arr;
	char *right = arr + len - 2;
	for (int i = 0; i < len/2; i++)
	{
		char tmp = 1;
		tmp = *(left+i);
		*(left + i) = *(right-i);
		*(right - i) = tmp;
	}
	//while (left < right){
	//	char temp = *left;
	//	*left = *right;
	//	*right = temp;
	//	left++, right--;
	//}
}

int main()
{
	char arr[] = "hello tomorrow";
	int len = sizeof(arr) / sizeof(arr[0]);//把‘\0’算进去了
	printf("逆置之前:%s\n", arr);
	Reverse(arr,len);
	printf("逆置值后:%s\n", arr);
    return 0;
}

3、求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

例如:2+22+222+2222+22222

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

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

int Add(int* a)
{
	int arr[5] = {0};
	int Sn = 0;
	arr[0] = *a;
	for (int i = 1; i < 5; i++)
	{
		arr[i] = arr[i - 1] + (*a) * pow(10, i);
	}
	for (int i = 0; i < 5; i++)
	{
		Sn += arr[i];
	}
	return Sn;
}

int main()
{
	int a = 2;
	int Sn = Add(&a);
	printf("%d\n", Sn);
	return 0;
}

4、求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

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

//计算几位数
int Digit(int x)
{
	int n;	//n位数
	for (n = 1; n < 7; n++)
	{


		if (x > 9)
		{	
			x = ((x) / 10);
			continue;
		}
		else
		{
			break;
		}
	}
	return n;
}

//判断是否为水仙花数
int Narcissus(int *n,int *x)
{
	int a = 0;	//等号右边结果
	int b = *x;	//等号左边数字
	for (int i = 1; i <= *n; i++)
	{
		a += pow((b % 10), *n);
		b = b / 10;
	}
	if (a == *x)
	{
		return *x;
	}
	else
	{
		return -1;
	}
}

int main()
{
	//int x = 153;
	//int n = Digit(x);
	//int m = Narcissus(&n, &x);
	//printf("%d ", m);

	int x;	//遍历的数字
	for (x = 0; x <= 100000; x++)
	{
		int n = Digit(x);	//n位数
		int m = Narcissus(&n, &x);	
		if (m == -1)
		{
			continue;
		}
		else
		{
			printf("%d ", m);
		}
	}
	return 0;
}

5、用C语言在屏幕上输出以下图案:

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

//用C语言在屏幕上输出菱形


void Diamond(int n)
{
	int a, b, c;
	for (a = 1; a <= n; a++)
	{
		for (b = 1; b <= abs(a - (n / 2 + 1)); b++)
		{
			printf(" ");
		}
		for (c = 1; c <= n - 2 * abs(a - (n / 2 + 1)); c++)
		{
			printf("*");
		}
		printf("\n");
	}
}


int main()
{
	Diamond(13);
	return 0;
}


6、喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。

int Drink(int money)
{
	int bot = money;
	int add = 0;
	int nobot = money;
	for (int i = 0; i < 100; i++)
	{
		add = nobot / 2;
		
		if (nobot % 2 == 1)
		{
			nobot = add;
			nobot++;
		}
		else
		{
			nobot = add;
		}
		bot += add;
		if (nobot == 1){
			break;
		}
	}
	return bot;
}

int main()
{
	int bot = Drink(20);
	printf("%d", bot);
}

7、VS开发环境调试下面的代码,画图解释下面代码的问题

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello bit\n");
    }
    return 0;
}

在这里插入图片描述
在这里插入图片描述
8、模拟实现库函数strlen

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//模拟实现库函数strlen

int strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "hello tomorrow";
	int str = strlen(arr);
	printf("%d", str);
	return 0;
}

9、模拟实现库函数strcpy

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

void my_strcpy(char* str, const char* ret)
{
	assert(*str != 'NULL');
	assert(*ret != 'NULL');
	while (*str++ = *ret++)
	{
		;
	}
}

int main()
{
	char arr1[] = "##############";
	char arr2[] = "hello tomorrow";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

10、输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//输入一个整数数组,实现一个函数,
//来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
//所有偶数位于数组的后半部分。

void Adjust(int arr[], int len)
{
	int i, j;
	for (i = 0; i < len; i++)
	{
		if ((arr[i] % 2) == 0)
		for (j = i + 1; j < len; j++)
		{
			int temp;
			if ((arr[j] % 2) == 1)
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
				break;
			}
		}
	}
}

int main()
{
	int arr[] = { 24, 64, 12, 61, 35, 46, 75, 97, 44, 66 };
	int len = sizeof(arr) / sizeof(arr[0]);
	Adjust(arr, len);
	for (int i = 0; i < len; i++)
	{
		printf("%3d", arr[i]);
	}
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值