NOIP练习题(2)

目录

[NOIP1999]回文数

[NOIP2008]笨小猴

 [NOIP2013]记数问题

水仙花数


                                                     念念难平,回忆锐起

昨天小编给大伙分享了三个高中生,初中生的竞赛题,大家都反馈很不错,于是小编快马加鞭在今天再跟大家分享三个竞赛题和一个小编自认为很不错的一个题目,那么我们话不多说,直接进入今天的正题。

 

[NOIP1999]回文数

这个题目在小编看来这个题目是今天分享题目中最难的一道,大伙可不要一看第一题难度这么大就放弃后面的题目,我们看到这个题目先分析什么是回文数,就是正着与反着读都是一样的数字称之为回文数,如果只是单单一个回文数,这个题目就只能用非常简单来形容,但是我们不单单要给一个两位数,还要给一个N,而这个N又是这个两位数的进制,意味着什么这个数字并不是我们想象之中的数字而是一个N进制数字,有很多小伙伴看到这里便束手无策了,大家不要担心,小编最开始也是对于这个题目毫无头绪可言,但是小编逐步分析一步一步尝试并且调试来得到正确程序,小编思路如下,这个题目我们需要每一次STEP就查看这个数字是否是回文数,因此我们先要创建一个函数用于判断(judge),那判断这个过程最简单,那后面我们就需要一步步得到这个数字,我们现将N进制数全部都先改变为10进制数,但是这个时候10进制以上的改变与10进制以下的结果是完全不一样的10进制以下的结果只用将字符减去48即可,而10进制以上并且大于10的'A','B','C','D','E','F'这几个英文字母却需要减去55才行,因此思路理清再创建一个函数实现此功能,转换完成之后,便需要改变这个数字,来实现STEP,最后再将我们得到的数字由10进制改变为N进制,各自分别用一个函数来实现,再将这些步骤放入循环,最后再判断STEP的大小,当大于30则打印impossible,这便这个题目的整个思路,如果一遍没有看懂,可以参考代码多看几遍,一步一步理解,代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
int Judge(char m[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		if (m[i] != m[sz - 1 - i])
		{
			return 1;
		}
	}
	return 0;
}
//判断是否为回文数
long long int transten(char m[], int sz, int n)
{
	long long int sum = 0;
	for (int i = 0; i < sz; i++)
	{
		int t = 0;
		if (m[i] >= 48 && m[i] <= 57)
		{
			t = ((int)m[i]) - 48;
		}
		if (m[i] >= 65 && m[i] <= 70)
		{
			t = ((int)m[i]) - 55;
		}
		sum += t * pow(n, sz - i - 1);
	}
	return sum;
}
//转N进制为10进制   
void change(char m[], int sz)
{
	char b[20] = { 0 };
	for (int i = 0; i < sz; i++)
	{
		b[i] = m[sz - i - 1];
	}
	for (int i = 0; i < sz; i++)
	{
		m[i] = b[i];
	}
}
//实现STEP的相加
int the(long long int a, int n)
{
	int sum = 0;
	while (a)
	{
		a = a / n;
		sum++;
	}
	return sum;
}
void transelse(long long int a, int n, char b[])
{
	int s = the(a, n);
	long long int h = a;
	int i = 0;
	if (n == 16)
	{
		while (h)
		{
			if (h % n < 9)
			{
				b[s - i - 1] = (char)((h % n) + 48);
			}
			else
				b[s - i - 1] = (char)((h % n) + 55);
			i++;
			h = h / n;
		}
	}
	else
		while (h)
		{
			b[s - i - 1] = (char)((h % n) + 48);
			i++;
			h = h / n;
		}
}
//转10进制为N进制
int main()
{
	int n;
	char m[100] = { 0 };
	scanf("%d %s", &n, m);
	int sz = strlen(m);
	int num = 0;
	while (Judge(m, sz))
	{
		num++;
		long long int sum = 0;
		sum = transten(m, sz, n);
		change(m, sz);
		sum += transten(m, sz, n);
		transelse(sum, n, m);
		sz = strlen(m);
	}
	if (num> 30)
		printf("Impossible!");
	else
		printf("STEP=%d", num);
	return 0;
}

本题难度小编给出的评分:9.9分!

[NOIP2008]笨小猴

 

 这个题目相比上一题可简单太多了,我们只需要将字母看成一个数组,当数组元素相同的时候就将这个值加加,唯一这题需要注意的点就是他的判断语句对于我们来说要小心小心再小心,最后需要将No Answer最后的值改为0,小编这个地方就没有注意还找了半天的问题,代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
    char a[100]={0};
    int max=0;
    int min=100;
    int flag=1;
    scanf("%s",a);
    for(int i=0;i<strlen(a);i++)
    {
        int sum=0;
        for(int j=0;j<strlen(a);j++)
        {
            if(a[i]==a[j])
            {
                sum++;
            }
        }
        if(sum>max)
        {
            max=sum;
        }
        if(sum<min)
        {
            min=sum;
        }
    }
    int ret=max-min;
    for(int i=2;i<=sqrt(ret);i++)//使用ret的开方这样所循环的次数更少
    {
        if(ret%i==0)
        {
            flag=0;
        }
    }
    if(flag==1&&ret!=1&&ret!=0)
    {
        printf("Lucky Word\n%d",ret);
    }
    else
    {
        ret=0;
        printf("No Answer\n%d",ret);
    }
    return 0;
}

本题难度评分:7分

 [NOIP2013]记数问题

这个题目就更加简单了就是高配版的0-99中有多少个9,其实可以采用递归来实现,不过小编直接用循环就完成了,大家可以下去自己试一试递归,就当对自己的锻炼,写完可以私信发给小编哦!,正确代码如下:

#include <stdio.h>

int main()
{
    int n;
    int x;
    int count=0;
    scanf("%d %d",&n,&x);
    for(int i=1;i<=n;i++)
    {
        int tmp=i;
        while(tmp!=0)
        {
            if(tmp%10==x)
            {
                count++;
            }
            tmp/=10;
        }
    }
    printf("%d",count);
    return 0;
}

本题难度评分:4-5分

水仙花数

水仙花数对于我们程序员来说可以是一点都不陌生,但是小编还是介绍一下何为水仙花数。

水仙花数:水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。除了水仙花数,我们还有:

一位自幂数:独身数

三位自幂数:水仙花数

四位自幂数:四叶玫瑰数

五位自幂数:五角星数

六位自幂数:六合数

七位自幂数:北斗七星数

八位自幂数:八仙数

九位自幂数:九九重阳数

十位自幂数:十全十美数

是不是非常的奇妙,所以这个题目,大家之后也可以去实现求各种各样的数,之所以将这个题目特别的写出来呢,主要还是为了递归,因为对于我们而言,递归是有些似懂非懂的,因此,我们要多加实践才可以磨炼自己,更加透彻的理解,递归递归,向哪递,怎么归?并且里面还用到了math.h中的pow函数,就是a的多少次方,大家也可以在cplusplus上多多查阅,多多使用这些函数,对于我们而言,多使用才可以做到耳熟能详,不会键盘在手,思路全无,大家可以看看我的代码,并分享,四叶玫瑰数,五角星数,六合数,北斗七星数,八仙数,九九重阳数,十全十美数,跟小编一起进步,小编的代码如下:

#include <stdio.h>
#include <math.h>
int Fac(int i)
{
    if(i>9)
    {
        return pow(i%10,3)+Fac(i/10);
    }
    else
    {
        return pow(i,3);       
    }
}
int main()
{
    int m,n;
    int count=0;
    while((scanf("%d %d",&m,&n))!=EOF)
    {
        for(int i=m;i<n;i++)
        {
            int ret=Fac(i);
            if(i==ret)
            {
                printf("%d ",i);
                count++;
            }
        }
        if(count==0)
            {
                printf("no");
            }
    }
    return 0;
}

本题难度评分:7.5分

这就是本期的四个题目,小编认为都是非常有意义的,对于初学者来说,难度正好,适合思考练手,咱们程序员切记不能眼高手低,要多多实践,唯有熟练才能进步!小编已经连着更新四天,真的很需要大家的鼓励,这也是小编动力,希望各位小伙伴们能够分享自己的代码截图,与小编一起打卡,严于律己!!!期待下期与大家相遇!

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vex小摆子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值