• 数组概念题目精选


    一. 字符串逆序

    数据范围:1≤len(str)≤10000

    输入描述:
    输入一个字符串,可以有空格

    输出描述:
    输出逆序的字符串

    首先分析题目 要求逆序字符串 并不是反向打印 这就要求我们改变字符串的内容

    按照题目的意思我们可以设计两个指针 一个指针指向最左边 一个指向最右边 (‘\0’)之前 然后使用这两

    个指针再加上一个临时变量把他们的顺序调换一下就可以啦

    代码如下

    #define _CRT_SECURE_NO_WARNINGS 1
    #include
    #include
    int main()
    {
    	char arr[10000] = "";
    	gets(arr);
    	char tmp = 0;
    	char* left = arr;
    	char *right = &arr[(strlen(arr) - 1)];
    	while (right>left)
    	{
    		tmp = *right;
    		*right = *left;
    		*left = tmp;
    		left++;
    		right--;
    	}
    	int i = 0;
    	for ( i = 0; i < strlen(arr); i++)
    	{
    		printf("%c",arr[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    几个易错点需要注意

    第一 不能使用scanf而要使用gets()
    因为scanf遇到空格会自动停止 从而导致后面的内容输入不进去

    第二 不能重头轻尾 最后的printf的格式要写对 博主因为写出算法太激动 导致后面printf写错好几次
    第三 最后的for循环使用strlen才可以打印出数组的全部内容 记得不要使用 strlen(arr)-1

    二. 打印菱形

    题目分析 菱形可以分成上下两部分来打印

    我们首先分析上半部分

    在这里插入图片描述

    我们假设这个图形有i行

    那么它每一行就具有2i -1个

    我们来打印看试试

    int main()
    {
    	int line = 0;
    	scanf("%d", &line);
    	for ( int i = 1; i <= line; i++)
    	{
    		int j = 0;
    		for ( j = 1; j <=2*i-1 ; j++)
    		{
    			printf("*");
    		}
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    我们发现 咦 忘记换行了 稍微改进下

    在这里插入图片描述
    我们发现 加上换行之变成这样子了 虽然星星的个数没错但是没有控制它们的位置

    我们再观察图形

    我们假设第1行有line个空格的 最后一行没有空格的话 那么 每一行的空格数就是line -i

    在这里插入图片描述
    这样子就能完美打印上半部分的菱形啦

    那完美再来看下半部分

    假设有line行 那么第一行就有2*line -1个

    第i行就有(2line-1)- 2(i -1)

    假设第一行没有空格 那么第i行的空格就是i个

    代码实现如下

    	for (int i = 1; i <= line; i++)
    	{
    		int j = 0;
    		for (j = 1; j <= i-1; j++)
    		{
    			printf(" ");
    		}
    		for (j = 1; j <= ((2 * line)-1)-2*(i-1); j++)
    		{
    			printf("*");
    		}
    		printf("\n");
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    打印出来就是这样子

    在这里插入图片描述
    然后我们再将下方的第一行取消掉

    // 下半部分
    	for (int i = 2; i <= line; i++)
    
    • 1
    • 2

    这样就可以完美实现啦

    在这里插入图片描述

    几个易错点需要注意

    这道题目的主要难点是想到将整个菱形一分为二 并且控制每一行的空格和星号 想明白每一行有多少就可以

    三. 打印水仙花数

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

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

    还是首先分析题目
    各位数字的n次方之和
    这就要求我们求出这是个几位数
    并且求出它的每一位数
    之后经过简单的计算就可以啦

    判断几位数

    	tmp = x;
    	while(tmp)
    	{
    		count++;
    		tmp /= 10;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    求出各位数字的n次方之和

    	while (tmp)
    	{
    		int ret = 0;
    		ret = pow(tmp % 10, count);
    		sum += ret;
    	/*	sum += pow(tmp % 10, count);*/
    		tmp/= 10;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    判断

    	if (x==sum)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    完整代码如下

    int is_Nu(int x)
    {
    	int count = 0;
    	int tmp = 0;
    	tmp = x;
    	while(tmp)
    	{
    		count++;
    		tmp /= 10;
    	}
    	// 计算出了count 几位数
    	int sum = 0;
    	// 计算每一位数的count次方
    	tmp = x;
    	while (tmp)
    	{
    		int ret = 0;
    		ret = pow(tmp % 10, count);
    		sum += ret;
    	/*	sum += pow(tmp % 10, count);*/
    		tmp/= 10;
    	}
    	if (x==sum)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    
    }
    
    int main()
    {
    	int i;
    	for ( i = 0; i <=100000; i++)
    	{
    		if (is_Nu(i)==1)
    		{
    			printf("%d ", i);
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    几个易错点需要注意

    这里需要注意的是x的值可能再函数内部起变化
    而我们不想它变化 这个时候就需要使用一个中间变量tmp来代替进行一些计算

    四. 计算求和

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

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

    题目分析
    一共有n项数 每一项数字的结构是i个a
    那么我们可以获取两个数字 n a
    再用这两个数字构造每一项 就可以得到最终的和了

    int main()
    {
    	int a = 0;
    	int n = 0;
    	int i = 0;
    	int sum = 0;
    	int tmp = 0;
     
     
    	scanf("%d%d", &a, &n);
    	for(i=0; i<n; i++)
    	{
    		tmp = tmp*10+a;
    		sum += tmp;
    	}
    	printf("%d\n", sum);
     
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码如上

    几个易错点需要注意

    这里要注意的和第三题一样要注意a的值不能改变 所以要使用一个tmp来接受a的值

    以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

    不吝赐教 在评论区或者私信指正 博主一定及时修正

    那么大家下期再见咯

  • 相关阅读:
    使用POI实现基于Excel的考试成绩分析
    三大云厂商 ARM 架构服务器性能对比
    敏捷项目管理解锁:2023年使用YouTrack的全面指南
    大数据-Spark-Spark开发高频面试题
    CDGA|促进数据生产要素在大湾区自由流动,培养数据治理人才先行
    从零开始探索C语言(十一)----共用体和位域
    solidty提升篇-智能协议-合约的所有权-gas-带参数的函数修饰符
    学习记录:TIM—电容按键检测
    QCN6274 VS QCN9274|QCN9074 VS QCN6122|Exploring the World of Wi-Fi 6E
    SpringCloud Alibaba【二】nacos
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126847415