刷题1

33 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情


题目描述

链接 在这里插入图片描述

思路

首先对于给定的一个数,要判断它的奇偶性。假设这个数是n,用count记录步数 1.偶数,n/=2;count++ 2.奇数,(3*n+1)/2赋给n,count++; 循环一直到n为1.最后输出.

代码实现

int f(int n)
{
	int count = 0;
	
	while (n!=1)//是否为1
	{
		if (n % 2 == 0)//偶
		{
			n /= 2;
			count++;
		}
		else//奇
		{
			n = (3 * n + 1) / 2;
			count++;
		}
	}
	return count;//步数
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d\n", f(n));
	return 0;
}

题目描述

题目描述链接 在这里插入图片描述

思路

在审题中我们发现,这个整数可以特别大,用int的类型根本无法存下,这个我们用数字字符进行储存。 1用'1'-'0' 进行运算。 用循环的方式把所有位上的数字进行求和sum,结束标准位\0. sum%10得到各个位数存在一个数组中,用n进行标记sum位数,也是数组的下标 我们可以枚举拼音数字

代码实现


#include <stdio.h>

int main()
{
	//创建字符数组
	char arr[100];
	//整数数组储存和的每个位数
	int brr[100]={0};
	//创建和
	int sum = 0,i=0,n=0;
	//创建拼音数字数组
	char* pin[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
	//输入整数
	scanf("%s", arr);
	//计算各个位数之和
	while (arr[i])
	{
		sum += arr[i] - '0';
		i++;
	}
	//储存sum的各个位数,同时用n进行标记
	//从个位数进行储存的
	while (sum)
	{
		brr[n] = sum % 10;
		sum /= 10;
		n++;
	}
	//输出
	while (n)
	{
		printf("%s", pin[brr[n-1]]);
		n--;
		if (n)//保证最后一个不打印空格
			printf(" ");
	}
	return 0;
}

题目描述

题目所在的链接,点进去察看题目 在这里插入图片描述

解题思路

第一步:查找字符串中除PAT之外的字符,如果存在就NO,在查找的过程中,PT只出现1一次,A至少存在一次,如果不满足NO 第二步:在这里插入图片描述 经分析,如果要YES,我们可以得到,1.c是a的倍数(c,a不为0时),最终得到a,c相等且b=1的状态。2.a,c都为0时,b的值随便(在上一步时判断了,b肯定不为0)。除此之外都是NO。

==代码有解释==

代码实现

#include <stdio.h>

int main()
{
	int n,a,b,c;
	scanf("%d", &n);
	char arr[10][100];
	int i = 0;
	for (i=0;i<n;i++)
	{
		scanf("%s", arr[i]);
	}
	i = 0;
	//统计P,T前a,中b,后c中A的个数
	while (i<n)
	{
		a = 0; b = 0; c = 0;
		char* temp = (char*)arr[i];
		//第一步开始进行判断
		while (*temp)
		{
			if (*temp == 'A')
				a++;
			else if (*temp == 'P')
				b++;
			else if (*temp == 'T')
				c++;
			else//不是这3个字符时跳出
				break;
			temp++;
		}
		//下面排除多P多T没有A的情况
		if (b!=1||c!=1||a==0)
		{
			printf("NO\n");
			i++;
		}
		//除PAT之外的字符
		else if (*temp!='\0')
		{
			printf("NO\n");
			i++;
		}
		//只含PAT的字符
		else
		{
			a = 0; b = 0; c = 0;
			temp = (char*)arr[i];
			//P前面的A的个数
			while (*temp++ != 'P'&& *temp)
			{
				a++;
			}
			//P与T之间的A的个数
			while (*temp++ != 'T' && *temp)
			{
				b++;
			}
			//T之后的A的个数
			while (*temp)
			{
				c++;
				temp++;
			}
			//变成aPbTc,其中a与c相等
			while (c)
			{
				if (a && c && c != a && c % a == 0)
				{
					c = c - a;
					b--;
				}
				else
					break;
			}
			if (b == 1&& c == a)//满足aPbTc的形式
				printf("YES\n");
			else if (a == 0&& c == a)//满足PbT的形式
				printf("YES\n");
			else//错误形式
				printf("NO\n");
			i++;
		}
	}
	return 0;
}