新生赛的做题思路-及题解

目录

跳房子

数字分解

回文数promax


跳房子

 测试的数据范围是(1<=n<=40)

输入样例: 2

输出样例:2

两种方法:(1): 1+ 1 (2)2格

输入样例: 3

输出样例:3

 两种方法:(1): 1+ 1  +1                (2)2 + 1                (3) 2 + 1

那么当你看到这里的时候,是否有一点思路呢?

是在想我要是输入的数据是5,那么我应该考虑多少种? 1 1 1 1 1     1 2 1 1 1  1 1 2 1 1。。。。

是不是感觉自己想得有点复杂了?

其实但你给他列举出来就会发现这是一个简单的叠加,就是后有个数等于前俩数之和(斐波拉切数字),me错就是这个.

如果说你单纯的去找规律,用1 或者 2 来进行排序,那么开始的想法就存在偏差,因为当在7的时候排序就已经达到了21种组合,所以他必定不是排序而说有规律,其实你会发现,当num=3 的时候是有三种组合,等于 前俩相加,num=4的时候,有五种组合,又是前两种相加,那么可以肯定的是最后的那个就是前两种相加,所以这个题是个找规律的题,但是注意循

#include <stdio.h>
int main(void)
{
    int n;
    scanf("%d", &n);
    if (n <= 2)
        return n; //用的好
    int before_last = 1, last = 2;
    for (int i = 2; i < n; i++)  //循环的次数
    {
        int current = before_last + last; 
        before_last = last;
        last = current;
        //其实是个规律题,就是后边的数等于前边俩数字之和
    }
    printf("%d", last);
    return 0;
}

环的次数 

数字分解 :

 我想这个题目,你一眼就知道想去怎么做了对不,将每个数值给单独弄出来,然后再进行递归算法,直至是单位数字就行了,也就达成了你的目的。

主要的思想就是来将每一位的数字来分离出来,然后再进行求和,其实这个时候我在后续的嵌套调用的时候,我可以考虑一下我的数字还是否需要去拆解

#include <stdio.h>
#define N 10000
int analy(int x);
int main(void)
{
	int num,in_put;
	scanf("%d", &num);
	//用函数来解决
	in_put=analy(num);
	printf("%d", in_put);
	return 0;
}
int analy(int x)  // 我这个函数的目的就是为了拆解的
{
	int t, sum = 0;
	if (x < 10)
		return x;
	else {
		while (x > 0) {
			sum += x % 10;
			x = x / 10;
		}
	}
	if (sum < 10)
		return sum;
	else
		return analy(sum);
}

回文数promax

那么在来一下最后一个题,这个题你首先是对回文数是有所了解的,然后再加上自己的小思路就能轻易的得到结果,题目如下:

 首先我们了解一个概念,什么是回文数,回文数指的是从左往右和从右往左的效果是一样的,就是关于中间的那个数字轴对称的,那么就好办,怎么实现呢》

利用数组的回文数:

#include<stdio.h>
int main(){
	int i,j,input;
	int num[100];
	printf("Example Input\n");
	scanf("%d",&input);
	for(i=0;input>0;i++){
		num[i]=input%10;		//每位放进数组
		input=input/10;
	}
	for(j=0;j<i/2;j++){
		if(num[j]!=num[i-j-1]) break;	//两边比较
	}
	i/2==j?printf("Example Output\ntrue"):printf("Example Output\nfalse");
	return 0;
}

或者讲述数字重置

#include <stdio.h>
int main()
{
    int n;
    int sum = 0;
    scanf("%d", &n);
    for (int i = n; i > 0; i /= 10)
    {
        sum = sum * 10 + i % 10; //把数字倒序
    }
    if (sum == n)
        printf("YES!");
    else
        printf("NO");
}

这就是回文数,那么我们的题你是否有思路了呢??

那我说一下我的想法

解题的思路:我分为两步,在此其实也是运用了俩函数,一个是判断回文数,一个判断右侧的条件是否成立:
第一个函数: 
s = x;
    while (s > 0) { //正序和逆序都是要求一样的
        y = y * 10 + s % 10;
        s = s / 10;
    }
    if (y == x) 
主要就是在这,要求从左到右和从有到左的都是吻合的,那就求得一个数让他扩大十倍,同时另外一个数字缩小十倍,最后再进行判断。
第二个函数就是那个判断能否在这里边找到,同时还要求是回文数,那么就在引入一下那个函数就好了.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1000
int judge(int x);
int judge2(int x);
int main()
{
    int num1, num2, i,count = 0; // num1 num2 分别是上下限,count是为了计数
    scanf("%d %d", &num1, &num2);
    for (i = num1; i <= num2; i++) {
        if (judge(i) && judge2(i))
            count++;
    }
    printf("%d", count);
    return 0;
}
int judge2(int x) {  //对右侧的判断
    int i;
    for (i = 2; i <= sqrt(x); i++) {
        if (x == pow(i, 2) && judge(i))
            return 1;
    }
    return 0;
}
int judge(int x)  //这个是回文数的判断
{
    int  s, y = 0;
    s = x;
    while (s > 0) { //正序和逆序都是要求一样的
        y = y * 10 + s % 10;
        s = s / 10;
    }
    if (y == x) 
         return 1;
    else
        return 0;
}

我是利用函数的多次调用的思想,既然那个回文数要判断,我就用的肯定不止一次,为何不调用呢,反正就是一个接口,其他的用不用去管,函数不是最为方便吗。以上就是一部分题目的分享,谢谢.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

i-阿松!

请给我一毛钱

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

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

打赏作者

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

抵扣说明:

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

余额充值