# 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);
}
}
# 总结
- 是一套比较简单的题目,
旨在培养读者避开陷阱的习惯。 - 希望读者一定要把这几道最简单的题目给掌握下来。