闲话不多说,先上代码!
#include
#include
void Print(char* arr) { //传入数组的首地址
int left = 0; //字符串左端
int right = strlen(arr)-1; //字符串右端
while (left < right) { //进入循环标志是左端往右走,右端往左走,两者碰面的时候是左小于右
int temp = *(arr + left);
*(arr + left) = *(arr + right);
*(arr + right) = temp; //一个朴实无华的交换
left++;
right--;
}
}
int main() {
char arr[10000] ={0};
scanf("%s",&arr);//gets(arr) //用scanf输入字符串内不能有空格,但是gets可以
Print(arr);
printf("%s", arr);
return 0;
}
如下图,定义一个left从字符串左端开始,定义一个right从字符串右端往左走,当往左走的left比往右走的right要小的时候,将这两个元素进行交换,从而实现一个字符串逆序的问题。
题目描述:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水?
喝汽水这个问题的实现其实并不复杂,就是小时候兑换的汽水一样,先上个图让大家看一看并理解理解。
喝完汽水后剩下了瓶子,你可以去兑换,根据上图发现汽水的瓶数为:20+10+5+2+1+1=39。接下来,上代码!!!
这个方法是最容易理解的,按照题目意思一步一步做下来就可以了!
#include
int main() {
int money = 0;//钱
int toble = 0;//汽水
int empty = 0;//空瓶子
scanf("%d", &money);
toble = money; //先进行初始化,瓶子的数量就等于钱数
empty = money; //进行初始化,喝完买的汽水就是空瓶汽水数量
while (empty >= 2) //当空瓶数量大于等于2的时候,进入循环
{
toble += empty / 2; //汽水数量的数量
empty = empty / 2 + empty % 2; //剩下的空瓶子加上上次剩下的空瓶子的数量
}
printf("%d\n", toble);
return 0;
}
这个做法与2中的做法一样,只不过加了一个函数,就好比穿了一身亮眼的衣服,但这个人的本质还是没有变。
#define P1 1 //汽水的单价
#define N1 2 //换一瓶汽水所需的空瓶数
//非递归
int empty(int toble) {
int ret = 0;
while (toble >= 2) {
ret += toble / N1;
toble = toble / N1 + toble % N1;
}
return ret;
}
int main()
{
int toble = 0; //汽水的数量
int money = 0; //总共多少钱
int toble_total = 0;
scanf("%d", &money);
toble = money / P1; //第一次的汽水瓶数
toble_total = toble + empty(toble);
printf("%d", toble_total);
return 0;
}
#define P1 1 //汽水的单价
#define N1 2 //换一瓶汽水所需的空瓶数
//递归 //利用宏定义方便修改值
int empty(int toble) {
int ret = toble/N1; //空瓶可以换的汽水数
int empty_s = toble / N1 + toble % N1; //剩下的空瓶子加上上次剩下的空瓶子的数量
if (empty_s >= 2) {
return ret + empty(empty_s); //进行递归,循环往复的增加瓶子数
}
else {
return ret;
}
}
int main()
{
int toble = 0; //汽水的数量
int money = 0; //总共多少钱
int toble_total = 0;
scanf("%d", &money);
toble = money / P1; //第一次的汽水瓶数
toble_total = toble + empty(toble); //从第一次的汽水瓶数加后续几次的瓶子数
printf("%d", toble_total);
return 0;
}
闲话不多说,上代码!
#include
int main() {
int i = 0;
int sz = 0;
scanf("%d", &sz); //sz为总的列数
//上半部
for (i = 0; i < sz / 2 + 1; i++) { //打印上半部分(加上最多**的一行)的计数器
//打印空格
int j = 0;
for (j = 0; j < sz / 2 - i; j++) { //打印每一行空格,从第一行起就发现空格逐渐递减,递减的个数与行数有关
printf(" "); //每进入一行打印相关联的几个空格
}
//打印*
for (j = 0; j < 2 * i + 1; j++) { //从第一行开始数发现每一行的**数目都为奇数且2*该行编号+1
printf("*");
}
printf("\n"); //每一行打印完就换一行
}
//下半部
for (i = 0; i < sz / 2; i++) { //打印的列数比上半部少一行
//打印空格
int j = 0;
for (j = 0; j < i+1; j++) { //下半部编号从1开始,空格在动态变化,一直打印空格到到第i行
printf(" ");
}
//打印*
for (j = 0; j < 2 * (sz / 2 - i) - 1; j++) { //是个奇数,根据变化所得的式子
printf("*");
}
printf("\n"); //每一行打印完就换一行
}
return 0;
}
大家可能觉得这菱形左右堆成啊,可是如果空格对称这不好去打呀,但是,如果你想一想,计算机多笨啊,是不是我只需要打印左边空格,再加上打印“*”,一行一行的打印下来岂不美哉!但是啊,也有细节哦,要将菱形分为上下两个部分,如果你仅仅看上面是不是金字塔的形状,看,你连金字塔都能打出来了!
自幂数是什么?简简简单的水仙花数就是一个自幂数,但如果是一位数,两位数,甚至是四位数五位数呢?
闲话不多说,先上代码:
#include
#include
int main() {
int i = 0;
for (i = 0; i <= 100000; i++) {
//1.求位数
int tmp = i; //不让i的值受到改变,引进一个tmp,
//将i的值赋给tmp进入到while循环里面去。
int count = 1; //为考虑到从0开始,与下面tmp>9相关联,先进入循环多一位
while (tmp > 9) { //只要是个位数就不进入循环
tmp /= 10; //数值多次整除10所得的数值
count++; //满足条件计数器+1
}
//2.求大小
tmp = i; //前面tmp的值已经被破坏了,所以要重新赋给tmp值为i
int sum = 0;
while (tmp) { //进入循环条件为tmp不等于0
sum += (int)pow(tmp % 10, count); //计算每一位的大小,将每一位的大小加起来
tmp /= 10;
}
//3.判断是不是自幂数
if (sum == i) {
printf("%d ",sum);
}
}
return 0;
}
这串代码看起来很复杂,但你根据每一步逐步进行写代码就很简单,先放一个大框架,再在大框架里面慢慢去写代码就能解决出来啦!
第一次刷的题目难度不大,只要有思路与框架慢慢写,注意细节,就能把题目做出来啦,大家在做这部分初阶C语言的时候要仔细认真慢慢地做!
客官,都看到这里了,何不来个三连~~~