倒置字符串、水仙花

《小题巧练》

              努力篇  ——  每天努力一点,离目标更近一点。 

目录

1.逆序字符串 

2. 倒置字符串

3.水仙花数

4.变种水仙花数 

5.喝汽水


1.逆序字符串 

问题描述:

 将一个字符串的内容颠倒过来,并输出。可以输入空格, 

示例:

输入:I am a student

输出:tneduts a ma I

“武器库”

gets():   char * gets ( char * str );

 功能:从标准输入stdin )   读取字符并将它们存储到str中,如果找到换行符,则不会将其复制到str中。

头文件:#include <stdio.h>

测试:

 问题:

分析:在新标准中,gets_s代替gets。gets_s(),并且参数除了数组名外,还需加上数组内的个数。了解即可。 

 

代码实现: 

#include <stdio.h>
#include <string.h>
#define num 10000
void my_reverse(char* str)
{
	int len = (int)strlen(str);
	int left = 0;
	int right = len - 1;
	int tmp = 0;
	while (left<right)
	{
		tmp = *(left +str);
		*(left + str) = *(right+str);
		*(right + str) = tmp;
		left++;
		right--;
	}
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("%c",str[i]);
	}
}

int main()
{
	char str[num] = {0};
	gets_s(str,num);
	my_reverse(str);
	return 0;
}

结果:

2. 倒置字符串

问题描述:

将一句话的单词进行倒置,标点不倒置。

示例:

输入: I like beijing.                     输出:beijing. like I

分析:

1.逆序每一个单词(寻找空格和“/0”)

2.逆序整个字符串 

代码实现:

#include <stdio.h>
#include <string.h>
void my_revers(char* left,char* right)
{
	char tmp = 0;
	while (left<right)
	{
		tmp = *left;
		*left = *right;
		*right = tmp;
		right--;
		left++;
	}
}
int main()
{
	char arr[101] = {0};
	gets_s(arr,101);

	char* cur = arr;

	//*cur=='\0'时结束循环
	while (*cur)
	{
		//单词的起点和终点下标
		char* start = cur;
		char* end = cur;
		//当*end碰到空格 或者‘\0’的时候确定一个单词
		while (*end != ' ' && *end != '\0')
		{
			end++;
		}
		//逆序一个单词
		my_revers2(start, end - 1);
		//把起始位置移动到第二个单词的开头
		if (*end  != '\0')//说明这里是空格
		{
			cur = end + 1;//新的起始位置
		}
		else
		{
			cur = end;
		}
	}
	//逆序整个字符串
	my_revers(arr,arr+strlen(arr) - 1);
	printf("%s\n",arr);
	return 0;
}

3.水仙花数

介绍:

水仙花数(Narcissistic number)指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

问题描述:

 在原有的基础上进行变形,“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。求出0~100000之间的所有“水仙花数”并输出。

“武器库”

pow():  double pow (double base, double exponent);

参数:基数,指数。

头文件:#include <math.h>

测试:

分析:

1. 求取k是几位数。

 2. 获取k中每个位置上的数据,并对其进行立方求和。

3. 对k中每个位上的数据立方求和完成后,在检测其结果是否与k相等。

代码实现:

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	//for循环取到0-100000
	for (i = 1; i < 100000; i++)
	{
		int count = 0;//计录i是几位数
		int tmp = i;
		//求tmp是几位数
		while (tmp)
		{
			tmp = tmp / 10;
			count++;
		}
		tmp = i;
		int sum = 0;
		//获取tmp每个位置上的数据,并对其进行立方求和。
		while (tmp)
		{
			sum += (int)pow((tmp % 10), count);//count 指数
			tmp = tmp / 10;
		}
		//判断是否为水仙花数
		if (i == sum)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

结果:

4.变种水仙花数 

问题描述:

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。问题:求出 5位数中的所有 Lily Number。

示例: 

655 = 6 * 55 + 65 * 5

1461 = 1*461 + 14*61 + 146*1

代码实现:

#include <stdio.h>
int main()
{

	int i = 0;
	//取所有的5位数
	for (i = 10000; i < 100000; i++)
	{
		int sum = 0;
		int n = 0;
		//计算所有拆分后的乘积之和
		for (n = 10; n <= 10000; n *= 10)
		{
			sum += (i / n) * (i % n);//除n取整,模n取余

		}
		//判断
		if (sum == i)
		{
			printf("%d ", i);
		}
	}

	return 0;
}

结果:

5.喝汽水

问题描述:

 小明想喝汽水,汽水1元1瓶,他手里有n元钱,2个空瓶可以换1瓶汽水,问花光他手里的钱,一共可以喝多少瓶汽水。

 示例:

输入:20

输出:39

代码实现: 

#include <stdio.h>
int main()
{
	int money = 0;
	int my_drink = 0;
	int  bottle = 0;
	scanf("%d", &money);
	my_drink = money;//一元一瓶
	bottle = money;

	while (bottle > 1)
	{
		my_drink += bottle / 2;
		bottle = bottle / 2 + bottle % 2;//最后可能余下一个空瓶
	}
	printf("%d元能喝到%d瓶汽水",money,my_drink);
	return 0;
}

结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值