一. 字符串逆序
数据范围:1≤len(str)≤10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
首先分析题目 要求逆序字符串 并不是反向打印 这就要求我们改变字符串的内容
按照题目的意思我们可以设计两个指针 一个指针指向最左边 一个指向最右边 (‘\0’)之前 然后使用这两
个指针再加上一个临时变量把他们的顺序调换一下就可以啦
代码如下
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> 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; }
几个易错点需要注意
第一 不能使用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行有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"); }
打印出来就是这样子
然后我们再将下方的第一行取消掉
// 下半部分 for (int i = 2; i <= line; i++)
这样就可以完美实现啦
几个易错点需要注意
这道题目的主要难点是想到将整个菱形一分为二 并且控制每一行的空格和星号 想明白每一行有多少就可以
三. 打印水仙花数
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
还是首先分析题目
各位数字的n次方之和
这就要求我们求出这是个几位数
并且求出它的每一位数
之后经过简单的计算就可以啦
判断几位数
tmp = x; while(tmp) { count++; tmp /= 10; }
求出各位数字的n次方之和
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 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); } } }
几个易错点需要注意
这里需要注意的是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; }
代码如上
几个易错点需要注意
这里要注意的和第三题一样要注意a的值不能改变 所以要使用一个tmp来接受a的值
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯