目录
- 例题一
- 题目解析及答案
- 例题二
- 题目解析及答案
- 例题三
- 题目解析及答案
- 例题四
- 题目解析及答案
- 例题五
- 题目解析及答案
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 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);//输入7for(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;
}