目录
跳房子:
测试的数据范围是(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; }
环的次数
数字分解 :![](https://i-blog.csdnimg.cn/blog_migrate/8abc9ea0c9501d6028e03c7d3b20a46a.png)
我想这个题目,你一眼就知道想去怎么做了对不,将每个数值给单独弄出来,然后再进行递归算法,直至是单位数字就行了,也就达成了你的目的。
主要的思想就是来将每一位的数字来分离出来,然后再进行求和,其实这个时候我在后续的嵌套调用的时候,我可以考虑一下我的数字还是否需要去拆解
#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; }
我是利用函数的多次调用的思想,既然那个回文数要判断,我就用的肯定不止一次,为何不调用呢,反正就是一个接口,其他的用不用去管,函数不是最为方便吗。以上就是一部分题目的分享,谢谢.