C语言指针基础题(二)

2023-12-13 21:58:35


感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿?🐿?🐿? C语言例题
🐣🐓🏀 python

例题一

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

题目解析及答案

这道题的核心就在于数组名是数组首元素地址,也就是*(arr+1)=arr[1]
详细可以看C语言深入理解指针(非常详细)(二)
方法一

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int sz = sizeof(arr) / sizeof(int);
	for(int i=0;i<sz;i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/41234a3286624acaa07f5c850ae06052.png)

方法二

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int* p = arr; 
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
    {
        printf("%d ", *p);  
        ++p;                 
    }
    
   	return 0;
}

在这里插入图片描述

例题二

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

题目解析及答案

方法一

void Reverse(char* str)
{
    char* left = str;
    char* right = str + strlen(str)-1;
    while(left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        ++left;
        --right;
    }
}
int main()
{
    char str[] = "hello jack";
    Reverse(str);
    return 0;
}

在这里插入图片描述

这个方法其实就是找到字符串中左右字符的地址,通过解引用实现交换

注意:如果是在线OJ时,必须要考虑循环输入,因为每个算法可能有多组测试用例进行验证,参考以下main函数写法

方法二

int main()
{
    char str[101] = {0};
    while(gets(str))
    {
        Reverse(str);
        printf("%s\n", str);
        memset(str, 0, sizeof(str)/sizeof(str[0]));
    }
    return 0;
}

关于memset的实现在之前C语言内存函数有写过

例题三

用C语言在屏幕上输出以下图案:
在这里插入图片描述

题目解析及答案

这是一个对称图形,其中有图形由空格符号还有*号组成

号以奇数的规律变化,空格符号和号在同一排的总数加起来为13

通过图形规律可以知道上半图形中 *号可以以循环for(i=1;i<=13;i=i+2)来表示

对于空格符号,左半部分的规律是j<=(13-i)/2,j++,右半部分则是j>=(14-(13-i)/2)

方法一

int main()
{
	int i = 1, j = 1;
	for (i = 1; i <= 13; i = i + 2)
	{
		while (j <= 13)
		{
			if (j<=(13 - i) / 2 || j>=(14 - (13 - i) / 2))
			{
				printf(" ");
				j++;
			}
			else
			{
				printf("*");
				j++;
			}
		}
		printf("\n");
		j = 1;
	}
	for (i = 11; i >= 1; i = i - 2)
	{
		while (j <= 13)
		{
			if (j <= (13 - i) / 2 || j >= (14 - (13 - i) / 2))
			{
				printf(" ");
				j++;
			}
			else
			{
				printf("*");
				j++;
			}
		}
		printf("\n");
		j = 1;
	}
	return 0;
	}

在这里插入图片描述
方法二

int main()
{
	int line = 0;
	int i = 0;
	scanf("%d", &line);//输入7
	for(i=0; i<line; i++)
	{
		int j = 0;
		for(j=0; j<line-1-i; j++)
		{
			printf(" ");
		}
		for(j=0; j<2*i+1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	for(i=0; i<line-1; i++)
	{
		int j = 0;
		for(j=0; j<=i; j++)
		{
			printf(" ");
		}
		for(j=0; j<2*(line-1-i)-1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

在这里插入图片描述

例题四

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

题目解析及答案

我们用i来表示水仙花数,通过for循环来表示0到100000的水仙花数

为了知道水仙花数有多少位,我们需要用到一个while循环,循环判断条件位水仙花数的余数不为0,因此我们使用一个变了j来保存水仙花数i,然后再进行判断,既while(j%10)

而为了计算有多少位,我们需要对每次循环用count来记录,然后每次循环让水仙花数减少一位数,也就是count++,j=j/10

之后我们再让j重新等于i,来进行判断是否是水仙花数

我们用一个变量sum来计算每位数的n次方总和,也就是sum=sum+pow(j%10,count)

最后就是判断了

#include<math.h>
int main()
{
	int i = 0, j = 0, sum = 0,count=0;
		for (i = 0; i < 100000; i++)
		{
			j = i;
			while (j % 10)
			{
				count++;
				j = j / 10;
			}
			j = i;
			for (int k = count; k >= 0; k--)
			{
				sum = sum + pow(j % 10, count);//pow数计算一个数的次方是多少
				j = j / 10;
			}
			if (i == sum)
				printf("%d ", i);
			sum = 0;
			count = 0;
	    }
	return 0;
}

在这里插入图片描述
这道题for循环用的比较多,如果对for循环有疑惑的可以看我之前写的一篇文章for和do-while循环以及break和continue语句

例题五

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

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

题目解析及答案

我们可以看到aa只是在a10的基础上再加上a,也就是aa=a10+a,aaa=aa*10+a

int main()
{
	int n = 0,a=0,b=0,Sn=0;
	scanf("%d %d", &n,&a);
	b = a;
	for (int i = 0; i < n; i++)
	{
		Sn = Sn + b;
		b = b * 10 + a;
	}
	printf("%d", Sn);
	return 0;
}

在这里插入图片描述

文章来源:https://blog.csdn.net/2301_79178723/article/details/134911722
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。