# NENUOJ 之 测试题

# 阶乘累加和 (opens new window)

# 题目描述

求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

# 输入

n

# 输出

# 样例输入 复制

5

# 样例输出 复制

153

# 提示

n的取值比较大,Sn需要定义成long long型,输出使用%lld 如果使用VC6调试,Sn定义成__int64,输出使用%I64d,提交时记得改回来。

# 思路:

这道题就是求阶乘之和,所以我们用一个变量保留第 i 位阶乘的值,然后用一个sum变量保存求和的结果就行。

怎么保留阶乘的值,这个办法有很多,但是用一个变量随着循环不断乘是比较简单的一种办法。

# 代码C语言:

#include<stdio.h>
int main(){
    long long Sn = 0;
    long long n = 0;
    long long temp = 1;
    scanf("%lld",&n);
    for(int i = 1; i <= n; i++){
        temp *= i;
        Sn += temp;
    }
    printf("%lld",Sn);
    return 0;
}

# 2001 斐波那契数列 (opens new window)

# 题目描述

斐波那契(Fibonacci,意大利数学家,1170年-1240年)数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……。这个数列从第三项开始,每一项都等于前两项之和。在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。 已知斐波那契数列第n项的计算公式如下。在计算时有两种算法:递归和非递归,请给出其中一种算法。 当n=0时,Fib(n)=0,当n=1时,Fib(n)=1,当n>1时,Fib(n)= Fib(n-1)+ Fib(n-2)

# 输入

第一行是测试数据的组数m,后面跟着m行输入。每行包括一个项数n和一个正整数a,(m,n,a均大于0,且均小于10000000)。

# 输出

输出包含m行,每行对应一个输入,若a不大于Fib(n),则输出Yes,否则输出No(中间没有空行)。

# 样例输入 复制

3
1 3
10 50
24 20000

# 样例输出 复制

No
Yes
Yes

# 思路:

Fibonacci数列这里用递推法求,可以防止超时。然后因为n可以是10000000这么大的数字,我们根本不需要去求到Fib[10000000]那么大,因为a最大也才1e7,所以我们只需要求到一定程度就可以了。所以当n大于47左右的时候,就可以直接输出Yes了,或者说,当n足够大,根本就不用管a是多少了,因为此时Fib[n]一定比a大。按照这个思路可以写出不止一种代码,期待读者自己研究。

# 代码C语言:

#include<stdio.h>
int f[100000];

// 进行 Fibonacci 的计算,只计算 1e9 以内的
void fibonacci(){
    f[0] = 1;
    f[1] = 1;
    for(int i = 2; i < 100000; i++){
        f[i] = f[i - 1] + f[i - 2];
        if(f[i] > 1e9)
            break;
    }
}

// 返回 Fibonacci 数列第 n 位
int fib(int n){
    return f[n];
}

int main(){
    int m;
    scanf("%d", &m);

    fibonacci();

    for(int i = 0; i < m; i++){
        int n, a;
        scanf("%d %d", &n, &a);
        if(n > 47){
            printf("Yes\n");
            continue;
        }
        if(a <= fib(n)){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
    
    return 0;
}

# 2002 四则运算 (opens new window)

# 题目描述

上一学期,周小小已经学过正整数的四则运算,新学期开学了,老师给他留了一道测试题,看他是否还能熟练的完成四则运算,此外还增加了一点新学期要学习的内容,看看他是否已经预习了。周小小假期光顾着玩,早把老师讲过的内容忘光了,只好求助于你了。

# 输入

输入文件中有若干行,每行依次为两个正整数,一个运算符(+、-、* 、/、%中的某一个)。文件结尾为两个0和运算符,这行不需要处理,只是标志输入结束。

# 输出

输出每行的表达式和运算结果,对于“/”,如果能除尽,则结果表示为整数,如果除不尽,保留2位小数。

# 样例输入 复制

1 2 +
3 4 /
5 6 -
0 0 +

# 样例输出 复制

1 + 2 = 3
3 / 4 = 0.75
5 - 6 = -1

# 思路:

这道题虽然说是四则运算,但是有五个运算符,注意注意!

正常模拟就可以,用if或者switch都可以,别忘了代码怎么写,括号还有break别忘了。

对于除号做特别判断即可,看看是要输出整数还是小数,判断能否除尽就是看是否有余数。

# 代码C语言:

#include<stdio.h>
int main(){
	
	int a,b;
	char c;
	double temp;
	while(~scanf("%d %d %c",&a,&b,&c)){
		if(a == 0 && b == 0) break;
		else{
			switch(c){
				case '+':printf("%d %c %d = %d\n",a,c,b,a+b);break;
				case '-':printf("%d %c %d = %d\n",a,c,b,a-b);break;
				case '*':printf("%d %c %d = %d\n",a,c,b,a*b);break;
				case '/':if(a % b==0) printf("%d %c %d = %d\n",a,c,b,a/b);else printf("%d %c %d = %.2f\n",a,c,b,1.0 * a/b);break;
				case '%':printf("%d %c %d = %d\n",a,c,b,a%b);break;
			}
		}
	}
	return 0;
}

# 2003 正整数解 (opens new window)

# 题目描述

周小小今天开始学习平方运算和开方运算了,老师布置了一道利用平方和开方来求解方程式的作业。如果这题让你来做,如何求解?

# 输入

输入有多行,每行一个正整数n,要求计算x * x + y * y = n的不同的正整数解(x<=y)。

# 输出

按照指定格式输出所有不同的解,输出格式为:No 1: 1 * 1 + 2 * 2 = 5。不同n的解之间加一个空行分隔,如果有多组解,按照x从小到大顺序输出结果。

# 样例输入 复制

5
50

# 样例输出 复制

No 1: 1 * 1 + 2 * 2 = 5

No 1: 1 * 1 + 7 * 7 = 50
No 2: 5 * 5 + 5 * 5 = 50

# 思路:

这道题正常模拟,x的范围是从1到根号n,y的范围是x到根号n【如果是根号二分之n什么的也可以】

满足 $x * x + y * y = n$ 还有 $x \leq y$ 即可

注意格式还有计数~

# 代码C语言:

#include<stdio.h>
int main(){
    int n;
    while(~scanf("%d",&n)){
        int cnt = 0;
        for(int i = 1;i <= sqrt(n);i++){
            for(int j = i;j <= sqrt(n);j++){
                if(i*i + j*j == n && i <= j){
                    cnt++;
                    printf("No %d: %d * %d + %d * %d = %d\n",cnt,i,i,j,j,n);
                }
            }
        }
        printf("\n");
    }
}

# 2004 鸡兔同笼 (opens new window)

# 题目描述

一个笼子里面关了鸡和兔子(鸡有2 只脚,兔子有4 只脚,没有任何例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。

# 输入

第1 行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (a < 32768) 。

# 输出

n 行,每行输出对应一个输入。输出是两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用空格分开。如果没有满足要求的情况出现,则输出2个0。

# 样例输入 复制

2
3
20

# 样例输出 复制

0 0
5 10

# 思路:

简单思路就是,想要最多的情况,就是全部都是鸡,想要最少的情况就是全部都是兔子【如果腿的个数不是4的倍数,就还得塞一只鸡】。什么时候要输出0 0,那就是腿的个数为奇数的情况。

按照以上思路去写代码就可以啦~

下面代码也讲得很清楚了。

# 代码C语言:

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int a;
        scanf("%d",&a);
        //奇数个脚时无解
        if(a % 2 == 1){
            printf("%d %d\n",0,0);
            continue;
        }
        //至少的情况就是兔子尽量多,那我们就尽量塞兔子
        if(a >= 4){
            //刚好全是兔子
            if(a % 4 == 0) printf("%d ",a / 4);
            else{
                //没办法刚好全是兔子,就要有一只鸡,然后再塞兔子
                printf("%d ",1 + (a - 2) / 4);
            }
        }else{
            //此时放不了兔子了
            printf("%d ",1);//只能塞一只鸡
        }
        //至多的情况就是鸡尽量多
        printf("%d\n",a / 2);
        
    }
}

# 总结

  1. 是一套比较简单的题目,旨在培养读者避开陷阱的习惯
  2. 希望读者一定要把这几道最简单的题目给掌握下来。