百日大刷题No.1

百日大刷题

  • 一、字符串逆序
  • 二、C语言经典问题之汽水问题
    • 1.解析
    • 2.非递归做法(不调用函数)
    • 3.非递归做法(调用函数)
    • 3.递归做法
  • 三、打印实心菱形
  • 四、水仙花数升级版(自幂数)
  • 总结

一、字符串逆序

闲话不多说,先上代码!

#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要小的时候,将这两个元素进行交换,从而实现一个字符串逆序的问题。

百日大刷题No.1_第1张图片

二、C语言经典问题之汽水问题

题目描述:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水?

1.解析

喝汽水这个问题的实现其实并不复杂,就是小时候兑换的汽水一样,先上个图让大家看一看并理解理解。
百日大刷题No.1_第2张图片
喝完汽水后剩下了瓶子,你可以去兑换,根据上图发现汽水的瓶数为:20+10+5+2+1+1=39。接下来,上代码!!!

2.非递归做法(不调用函数)

这个方法是最容易理解的,按照题目意思一步一步做下来就可以了!

#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;
}

3.非递归做法(调用函数)

这个做法与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;
}

3.递归做法

#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;
}


如下图:进行五次递归后得到数值的大小。
百日大刷题No.1_第3张图片

三、打印实心菱形

闲话不多说,上代码!

#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;
}

大家可能觉得这菱形左右堆成啊,可是如果空格对称这不好去打呀,但是,如果你想一想,计算机多笨啊,是不是我只需要打印左边空格,再加上打印“*”,一行一行的打印下来岂不美哉!但是啊,也有细节哦,要将菱形分为上下两个部分,如果你仅仅看上面是不是金字塔的形状,看,你连金字塔都能打出来了!
百日大刷题No.1_第4张图片

四、水仙花数升级版(自幂数)

自幂数是什么?简简简单的水仙花数就是一个自幂数,但如果是一位数,两位数,甚至是四位数五位数呢?
闲话不多说,先上代码:

#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语言的时候要仔细认真慢慢地做!

客官,都看到这里了,何不来个三连~~~

你可能感兴趣的:(c语言,算法,数据结构,c++)