题解 | 数的计算-NOIP2001普及组复赛A题
A-数的计算_NOIP2001普及组复赛
https://ac.nowcoder.com/acm/contest/229/A
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n ≤ 1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
先输入一个自然数n(n ≤ 1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入描述:
1个自然数
输出描述:
1个整数,表示具有该性质数的个数。
示例1
输入
6
输出
6
解答
满足条件的数为
6,16,26,126,36,136
6,16,26,126,36,136
提供几组测试数据: 0 1 2 3 4 5 100 500 1000
答案: 1 1 2 2 4 4 9828 26338428 1981471878
n=1000需要的时间挺长的,居然没有超时
Accepted代码:
#include <stdio.h> int count; void mid(int n) { if(n == 1) return;//注意递归结束条件 int i = n/2; count += i; for(; i > 0; i--) mid(i); } int main() { int t; count = 1; scanf("%d", &t); mid(t); printf("%d\n", count); return 0; }上面代码是由下面代码改进而来:
#include <stdio.h> int count; void mid(int n) { if(n == 1) return;//注意递归结束条件 for(int i = n/2; i > 0; i--){ mid(i); count++; } } int main() { int t; count = 0; scanf("%d", &t); mid(t); printf("%d\n", count+1); //+1是加上本身不做处理的那个数,即n return 0; }
来源:如果名字不长一点ta就老说名字已存在