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