(头歌)c语言程序设计------------函数-爱代码爱编程
第1关:求和
任务描述
题目描述:给你一个n
,要求你编写一个函数求1+2+.......+n.
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。
输入 输入一个n
输出 输出1+2+.......+n
的和
测试说明
样例输入:
100
样例输出:
5050
代码如下
#include<stdio.h>
//编写函数
/*********Begin*********/
int sum(int n)
{
if(n==0)
return 0;
else
return n + sum(n - 1);
}
/*********End**********/
int main(void)
{
/*********Begin*********/
int n;
scanf("%d",&n);
printf("%d\n",sum(n));
/*********End**********/
return 0;
}
第2关:回文数计算
任务描述
本关任务:编写函数求区间[200,3000]
中所有的回文数,回文数是正读和反读都是一样的数。如525
, 1551
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。 输入 无需输入
输出 输出区间[200,3000]
中所有的回文数,一行一个回文数,不需要输出其它无关的字符。
202
212
222
232
242
.....
测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。
代码如下
#include <stdio.h>
void solve() {
/*********Begin*********/
int i,a,b,c,d;
for(i=200; i<=3000; i++) {
a=i/1000;
b=(i-a*1000)/100;
c=((i-a*1000)-b*100)/10;
d=i%10;
if(i<1000 && b==d)
printf("%d\n",i);
if( i>=1000 && a==d && b==c)
printf("%d\n",i);
}
/*********End**********/
}
int main(void)
{
solve();
return 0;
}
第3关: 编写函数求表达式的值
任务描述
题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + .... + (1 * 2 * 3 * .... * n) / (3 * 5 * 7 * ... * (2 * n + 1))
。
编写函数求给出的n所对应的表达式s的值。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。 输入
一个整数n
输出
输出表达式的值,保留小数点后10位的值。
测试说明
样例输入:
4
样例输出:
1.5492063492
代码如下
#include "stdio.h"
/*********Begin*********/
int function(int n);
int function(int n) {
double a=1,b=1,i;
double s=0;
for(i=0; i<=n; i++)
{
if(i==0 || i==1) a=1;
else a=a*i;
b=b*(2*i+1);
s+=(double)a/b;
}
printf("%.10lf\n",s);
}
/*********End**********/
int main(void) {
/*********Begin*********/
int n;
scanf("%d",&n);
function(n);
/*********End**********/
return 0;
}
第4关:阶乘数列
任务描述
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!
之值,其中n
是一个数字。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。 输入
一个整数n(1<=n<=20)
输出 输出表达式的值,占一行。
测试说明
样例输入:
5
样例输出:
153
提示:
用int
可能会溢出,需要用能表示更大范围的long long
int
(注:VC6.0
不支持此类型,VC
下使用可使用__int64
替代)
代码如下
#include <stdio.h>
long long int fact (int n)
{
/*********** begin *************/
if(n==1)
return 1;
else
return n*fact(n-1);
/************ end **************/
return 0;
}
long long int factsum (int n)
{
/*********** begin *************/
if(n==1)
return fact(1);
else
return fact(n)+factsum(n-1);
/************ end **************/
return 0;
}
int main ()
{
int n ;
scanf("%d",&n);
long long int sum;
sum = factsum(n);
printf("%lld", sum);
return 0;
}
第5关:亲密数
任务描述
题目描述:两个不同的自然数A
和B
,如果整数A
的全部因子(包括1
,不包括A
本身)之和等于B
;且整数B的全部因子(包括1
,不包括B
本身)之和等于A
,则将整数A
和B
称为亲密数。求3000
以内的全部亲密数。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充。 输入 无需输入 输出 3000
以内的全部亲密数(输出格式:(A
,B
),不加换行,不加分隔符号) 一对亲密数只输出一次,小的在前
测试说明
样例输出:
(220,284)(1184,1210)(2620,2924)
提示:
按照亲密数定义,要判断数a是否有亲密数,只要计算出a的全部因子的累加和为b
,再计算b
的全部因子的累加和为n
,若n
等于a
则可判定a
和b
是亲密数。计算数a
的各因子的算法:
用a依次对i(i=1~a/2)
进行模运算,若模运算结果等于0
,则i
为a
的一个因子;否则i就不是a
的因子。
代码如下
#include<stdio.h>
void solve()
{
/*********Begin*********/
int a,b,sum,i;
for(a=1;a<=3000;a++)
{
b=0;sum=0;
for(i=1;i<a;i++)
if(a%i==0)
b+=i;
for(i=1;i<b;i++)
if(b%i==0)
sum+=i;
if(sum==a&&a<b)
printf("(%d,%d)",a,b);
}
/*********End**********/
}
int main(void)
{
solve();
return 0;
}
第6关:公约公倍数
任务描述
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
相关知识(略)
编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End
区域内进行代码补充,变量类型使用long long int
。 输入 两个正整数 输出 最大公约数 最小公倍数 如果输入的数中包含负数,则输出Input Error
测试说明
样例输入:
6 15
样例输出:
3 30
提示:
- 负数没有最大公约数和最小公倍数;
- 最大公约数和最小公倍数一定为正数,不可以为负数;
- 需要考虑代码运行效率,否则会评测超时。
代码如下
#include<stdio.h>
//编写最大公约数GCD函数
/*********Begin*********/
long long int gcd(int a, int b)
{
if( b == 0 )
return a;
else
return gcd(b,a%b);
}
/*********End**********/
//编写最小公倍数LCM函数
/*********Begin*********/
long long int lcm(int a, int b)
{
return a / gcd(a, b)*b;
}
/*********End**********/
int main(void)
{
/*********Begin*********/
long long int x, y;
scanf("%d %d", &x, &y);
if( gcd(x,y)<0||lcm(x,y)<0)
{
printf("Input Error");
return 0;
}
else
{
printf("%lld ", gcd(x,y));
printf("%lld", lcm(x,y));
}
/*********End**********/
return 0;
}