Have Fun with Numbers

玩数字

请注意,数字123456789是一个9位数,正好包含从1到9的数字,没有重复。加倍,我们将得到246913578,正好是另一个9位数,正好是从1到9的数字,只是在一个不同的排列中。检查看看结果,如果我们再次翻倍!

现在,您应该检查这个属性是否有更多的数字。也就是说,将给定的数字加倍k数字,您将知道产生的数字是否仅由原始数字中的数字排列组成。

输入规格:

每个输入包含一个测试用例。每个大小写包含一个不超过20位数的正整数。

输出规格:

对于每个测试用例,首先在一行“是”中打印“是”,如果输入数字加倍,则给出一个数字,该数字仅由原始数字中的数字排列组成,如果不是,则为“否”。然后在下一行,打印加倍的数字。

样本输入:

1234567899

样本输出:

Yes
2469135798

思路分析

1.接收数据 char str[]

2.从最低位往最高位,先将 str[] 中每个字符转换为整数 temp(temp 作为数组 num[] 的下标),再将 temp 出现的次数记在 num[] 中, 然后再判断加倍后的 temp 会不会大于 9,大于 9 的话要让下一位进 1,加倍后的 temp 出现的次数在 num[] 中再减掉,这样步骤 3 判断 num[] 中是否都为 0 就可以知道是否由原始数字中的数字排列组成

3.输出结果,先判断是否首位要进一,再判断 num[] 中是否都为 0

代码

#include <stdio.h>
#include <string.h>
int main(){
	
	//1.接收数据 char str[], strNew[] 则用来存加倍后的字符串
	// ? 数组长度为22: 最长为20,但要加上字符串数组最后一位存的 '\0' ,而且加倍后有可能首位会进一
	char str[21], strNew[22] = "";
	gets(str); 
	
	/*
	2. ? 从最低位往最高位,先将字符型转换为整数型 temp(temp 作为数组 num[] 的下标),再将 temp 出现的次数记在 num[] 中, 然后		再判断加倍后的 temp 会不会大于 9,大于 9 的话要让下一位进 1,加倍后的 temp 出现的次数在 num[] 中再减掉  
	*/ 
	int num[10] = {0,0,0,0,0,0,0,0,0,0};//下标 0 ~ 9 的 num[] 中元素一开始均为 0
	int len = strlen(str), temp, flag = 0;//flag 用来记加倍后是否进位		
	
    for(int i = len - 1; i >= 0; i--){
		temp = str[i] - '0';//将 str[] 中每个字符转换为整数 temp 
		num[temp]++;//对应下标加一
		if(temp < 5){
			strNew[i] = (char)(temp * 2 + flag + '0');//将整数型转换为字符型存在 strNew[] 中  
			num[temp * 2 + flag]--;//对应下标
			flag = 0;//下一位不用进一					
		}else{
			strNew[i] = (char)((temp * 2) % 10 + flag + '0');
			num[(temp * 2) % 10 + flag]--;
			flag = 1;//下一位进一 
		}	
	}
		
	//3. ? 输出结果,先判断是否首位要进一,再判断 num[] 中是否都为 0				
	if(flag == 1){//判断是否首位要进一
		printf("%s\n%c%s","No",'1',strNew);		
	}else{
		for(int j = 0; j < 10; j++){//判断 num[] 中是否都为 0
			if(num[j] != 0){
				printf("%s\n%s","No",strNew);
				break;
			}
            if(j == 9){
                printf("%s\n%s","Yes",strNew);
            }
	    }	
	}	
} 

错因分析

错误: 输出时末尾出现乱码

原因: 字符串结尾并没有结尾符’\0’

措施: 可以在 strNew[] 赋值末尾赋上 ‘\0’ 或者初始化 strNew[] = “”;

知识点

gets 函数读入一行字符串时,会在最末尾自动加上’\0’结尾

模板

1.在字符串数组 str[] 末尾赋上 ‘\0’
方法一: 赋完值后直接 str[i] = '\0';
方法二: 初始化时 str[20] = ""; 
2. 整数型与字符型互换
整数型 --> 字符型: strNew[i] = (char)(temp * 2 + flag + '0');   
字符型 --> 整数型: temp = str[i] - '0';
3. 对照两串长度不超过 20 位的数出现的数字是否一样,如 12234 与 23241 则一样
分析: int, long, unsigned int, unsigned long 最多存 10 位的数(不包括所有的数), 再长就要用 数组 来存 

int num[10] = {0,0,0,0,0,0,0,0,0,0};//下标 0 ~ 9 的 num[] 中元素一开始均为 0
num[temp]++;//对应下标加一
num[temp * 2 + flag]--;//对应下标
for(int j = 0; j < 10; j++){
	if(num[j] != 0){
		printf("%s\n%s","No",strNew);
		break;
	}
    if(j == 9){
        printf("%s\n%s","Yes",strNew);
    }
}	
4. flag的妙用一

flag 常用于标记,此处用于 if-else 分支处区分走的是哪一条分支

### 回答1: “fun with even subarrays” 的意思是“玩转偶数子数组”,其中“偶数子数组”指的是数组中元素个数为偶数的子数组。这个话题可能涉及到数组的遍历、子数组的生成、偶数个元素的判断等等。具体的实现方法和应用场景需要根据具体情况来确定。 ### 回答2: "fun with even subarrays" 可以理解为与偶数子数组有趣的互动。 一个子数组是指原数组中连续的一部分元素组成的数组,而偶数子数组则是指子数组中包含偶数个元素的子数组。 与偶数子数组的互动可以通过以下方式实现: 1. 统计偶数子数组的个数:遍历原数组,判断每个子数组的长度是否为偶数,并计数出现的次数。可以使用一个计数器来记录偶数子数组的出现次数。 2. 打印偶数子数组:遍历原数组,并使用嵌套循环来找到所有的偶数子数组。对于每个子数组,判断其长度是否为偶数,如果是则打印该子数组。这样可以将所有的偶数子数组输出到控制台或其他地方,以供查看和分析。 3. 操作偶数子数组:根据偶数子数组的位置和元素,可以进行各种操作。例如,可以对偶数子数组中的元素进行排序、求和、求平均值等计算,也可以将偶数子数组的元素进行修改、替换等操作。这样可以深入了解和探索偶数子数组的特性和性质。 4. 寻找特定结构的偶数子数组:可以在原数组中寻找特定结构的偶数子数组,例如找到长度为4的偶数子数组,或者找到和为特定值的偶数子数组等。这样可以在偶数子数组中发现规律和模式,并进行进一步的研究和分析。 总之,“fun with even subarrays”是一种有趣的互动方式,可以通过统计、打印、操作和寻找特定结构的偶数子数组来深入理解和探索原数组中偶数子数组的性质和特点。 ### 回答3: 趣味性是人们在日常生活中追求的一种心理满足。而对于连续子数组这样的概念,我们可以通过一些有趣的方法进行探索。 首先,我们可以通过游戏的方式来增加连续子数组的趣味性。比如,可以设计一个游戏规则,要求玩家在一个给定的数组中找到所有的偶数子数组。玩家需要快速地遍历数组,并标记出所有满足条件的子数组。这样一来,寻找偶数子数组就变成了一个有趣的挑战,增加了游戏的趣味性。 此外,我们还可以通过一些算法和技巧来解决连续子数组的问题,从而使之更加富有趣味性。比如,可以使用动态规划算法来求解最长的连续偶数子数组,或者设计一种巧妙的数据结构来快速找到所有的偶数子数组。这样一来,我们不仅可以提升连续子数组问题的解决效率,还可以增加问题本身的趣味性。 最后,我们还可以将连续子数组的概念与其他有趣的问题进行结合,从而创造出更多有趣的问题。比如,我们可以设计一个题目,要求在一个数组中找到和最大的偶数子数组;或者设计一个游戏,要求玩家通过调整数组中的数字,使得所有的子数组都是偶数。这样一来,连续子数组的概念就与其他问题产生了有趣的结合,使得问题解决过程更加有趣。 总之,通过游戏化、算法优化以及与其他问题的结合,我们可以使连续子数组问题更加有趣。无论是解决问题的过程,还是问题本身的设计,都可以通过一些巧妙的思路来提升趣味性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小白_鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值