目录
7-1 递归实现顺序输出整数:
-本题要求实现一个函数,对一个整数进行按位顺序输出。
-本题要求实现一个函数,对一个整数进行按位顺序输出。
-函数接口定义:
void printdigits( int n );
-函数printdigits
应将n
的每一位数字从高位到低位顺序打印出来,每位数字占一行。
-裁判测试程序样例:
#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
/* 你的代码将被嵌在这里 */
-输入样例:
12345
-结尾无空行
-输出样例:
1
2
3
4
5
-解答-
void printdigits( int n ){
if(n<10) printf("%d\n",n);
else{
printdigits(n/10);
printf("%d\n",n%10);
}
}
7-2 递归求简单交错幂级数的部分和:
-本题要求实现一个函数,计算下列简单交错幂级数的部分和:
-f(x,n)=x−x2+x3−x4+⋯+(−1)n−1xn
-函数接口定义:
double fn( double x, int n );
-其中题目保证传入的n
是正整数,并且输入输出都在双精度范围内。函数fn
应返回上述级数的部分和。建议尝试用递归实现。
-裁判测试程序样例:
#include <stdio.h>
double fn( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%.2f\n", fn(x,n));
return 0;
}
/* 你的代码将被嵌在这里 */
-输入样例:
0.5 12
-输出样例:
0.33
-解答1(函数法)-
double fn( double x, int n){
if( n== 1) return x;
else
return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}
-解答2(计算找规律法)-
//n=1,f(x,1)=x;
//n=2,f(x,2)=x-x*x=x*(1-x);
//n=3,f(x,3)=x-x*x+x*x*x=x*(1-x+x*x)=x*(1-x*(1-x));
//即,n=i时,f(x,i)=x*(1-f(x,i-1)); (i>1,i属于N)
double fn( double x, int n ){
if(n==1) return x;
else return x*(1-fn(x,n-1));
}
7-3 出生年:
-以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y
年,直到x
岁才遇到n
个数字都不相同的年份”这句话。
-输入格式:
-输入在一行中给出出生年份y
和目标年份中不同数字的个数n
,其中y
在[1, 3000]之间,n
可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。
-输出格式:
-根据输入,输出x
和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n
个数字都不相同”是指不同的数字正好是n
个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
-输入样例1:
1988 4
-输出样例1:
25 2013
-输入样例2:
1 2
-输出样例2:
0 0001
-解答(此处没使用函数)-
#include <stdio.h>
int main(){
int bir[4];
int year, n; scanf("%d%d",&year, &n);
int i, count = 0;
for(i=year; i<3020; i++){//考虑到输入的是出生年份,作为界限的目标年份未知,取i<3020(其实经过检测上界限为3012)
count = 1;
bir[0] = i/1000;
bir[1] = i/100%10;
bir[2] = i/10%10;
bir[3] = i%10;//转化成数字
if(bir[0] != bir[1] && bir[0] != bir[2] && bir[0] != bir[3]) count++;
if(bir[1] != bir[2] && bir[1] != bir[3]) count++;
if(bir[2] != bir[3]) count++;//要求各项比较为异时记录数递加
if(count == n) break;
}
printf("%d %04d", i-year, i);
}
7-4 近似求PI:
-本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
-2π=1+31!+3×52!+3×5×73!+⋯+3×5×⋯×(2×i+1)i!+⋯
-输入格式:
-输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
-输出格式:
-在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
-输入样例:
1E-5
-输出样例:
PI = 3.14158
-解答-
#include<stdio.h>
int main(void){
double i=1;
double eps,sum=0,re=1;
scanf("%le", &eps);
while(re>=eps){
sum = sum + re;
re = re * i/(2*i+1);
i = i + 1;
}
sum = sum + re;
printf("PI = %.5f",2*sum);
return 0;
}