| 
 | 
 
1.编辑与调试  2.顺序结构  3.选择结构一  4.选择结构二  5.循环一  6.循环二  7.函数 
8.递归与嵌套函数  9.一维数组和二维数组  10.字符数组  11.指针一  12.指针二  13.结构体  
14.文件 
函数 
 
第1关:求和 
 
任务描述 
题目描述:给你一个n,要求你编写一个函数求1+2+.......+n. 
输入 
输入一个n 
输出 
输出1+2+.......+n的和 
样例输入 
100 
样例输出 
5050 
解题程序 
/* 第1关:求和 */ 
 
#include<stdio.h> 
//编写函数 
/*********Begin*********/ 
int sum(int n) 
{ 
    int i, sum = 0; 
    for(i = 1; i <= n; i++) 
        sum += i; 
    return sum; 
} 
/*********End**********/  
int main(void) 
{   
    /*********Begin*********/ 
    int n; 
    scanf(&#34;%d&#34;, &n); 
    printf(&#34;%d\n&#34;, sum(n)); 
    /*********End**********/  
    return 0; 
} 
 
第2关:回文数计算 
 
任务描述 
本关任务:编写函数求区间[200,3000]中所有的回文数,回文数是正读和反读都是一样的数。如525, 1551 
输入 
无需输入 
输出 
输出区间[200,3000]中所有的回文数,一行一个回文数,不需要输出其它无关的字符。 
202 
212 
222 
232 
242 
..... 
解题说明 
根据进制原理对一个整数的各位求其逆序的值。 
解题程序 
/* 第2关:回文数计算 */ 
 
#include<stdio.h> 
 
#define NS 200 
#define NE 3000 
 
void solve(){ 
    /*********Begin*********/ 
    int i, k, t; 
    for(i = NS; i <= NE; i++) { 
        k = i, t = 0; 
        while(k) t *= 10, t += k % 10, k /= 10; 
        if(t == i) printf(&#34;%d\n&#34;, 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的值。 
输入 
一个整数n 
输出 
输出表达式的值,保留小数点后10位的值。 
测试说明 
 样例输入: 
4 
样例输出: 
1.5492063492 
解题说明 
输出格式题面没有说清楚,应该是小数点保留10位。 
使用迭代计算应该是比较快的。 
解题程序 
/* 第3关: 编写函数求表达式的值 */ 
 
#include<stdio.h> 
//编写题目要求的函数 
/*********Begin*********/ 
double sum(int n) 
{ 
    double sum = 1, t1 = 1, t2 = 1, odd = 1; 
    int i; 
    for(i = 1; i <= n; i++) { 
        t1 *= i; 
        t2 *= (odd += 2); 
        sum += t1 / t2; 
    } 
} 
/*********End**********/  
int main(void) 
{   
    /*********Begin*********/ 
    int n; 
    scanf(&#34;%d&#34;, &n); 
    printf(&#34;%.10f\n&#34;, sum(n)); 
    /*********End**********/  
    return 0; 
} 
 
第4关:阶乘数列 
 
任务描述 
题目描述:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 
输入 
一个整数n(1<=n<=20) 
输出 
输出表达式的值,占一行。 
测试说明 
样例输入: 
5 
样例输出: 
153 
提示: 
用int可能会溢出,需要用能表示更大范围的long long int(注:VC6.0不支持此类型,VC下使用可使用__int64替代) 
解题说明 
使用迭代计算是合适的,比较快一些。 
解题程序 
/* 第4关:阶乘数列 */ 
 
#include<stdio.h> 
//编写函数 
/*********Begin*********/ 
long long sum(int n) 
{ 
    long long sum = 0, t = 1; 
    int i; 
    for(i = 1; i <= n; i++) { 
        t *= i; 
        sum += t; 
    } 
    return sum; 
} 
/*********End**********/  
int main(void) 
{   
    /*********Begin*********/ 
    int n; 
    scanf(&#34;%d&#34;, &n); 
    printf(&#34;%lld\n&#34;, sum(n)); 
    /*********End**********/  
    return 0; 
} 
 
第5关:亲密数 
 
任务描述 
题目描述:两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。 
输入 
 无需输入 
输出 
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的因子。 
解题说明 
虽然说把功能封装到函数可以提升代码复用性,但是牺牲了速度。 
好的做法是一次性计算因子之和(避免重复计算),再行判断亲密数。参考链接:I00039 亲密数(Amicable numbers))。 
解题程序 
/* 第5关:亲密数 */ 
 
#include<stdio.h> 
 
#define N 3000 
 
int getSum(int n) 
{ 
    int sum = 0, i; 
    for(i = 1; i < n; i++)         
        if(n % i == 0) sum += i; 
    return sum; 
}  
 
void solve(){ 
    /*********Begin*********/ 
    int a, b; 
    for(a = 2; a <= N; a++) { 
        b = getSum(a); 
        if(a == getSum(b) && a < b) 
            printf(&#34;(%d,%d)&#34;, a, b);  
    } 
    /*********End**********/  
} 
int main(void) 
{   
    solve(); 
    return 0; 
} 
第6关:公约公倍数 
 
任务描述 
题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 
输入 
两个正整数 
输出 
最大公约数 最小公倍数 
如果输入的数中包含负数,则输出Input Error 
测试说明 
样例输入: 
6 15 
样例输出: 
3 30 
提示: 
    负数没有最大公约数和最小公倍数; 
    最大公约数和最小公倍数一定为正数,不可以为负数; 
    需要考虑代码运行效率,否则会评测超时。解题程序 
/* 第6关:公约公倍数 */ 
 
#include<stdio.h> 
//编写最大公约数GCD函数 
/*********Begin*********/ 
long long gcd(long long n, long long m) 
{ 
    return m == 0 ? n : gcd(m, n % m); 
} 
/*********End**********/  
 
//编写最小公倍数LCM函数 
/*********Begin*********/ 
long long lcm(long long n, long long m) 
{ 
    return n / gcd(n, m) * m; 
} 
/*********End**********/  
int main(void) 
{   
    /*********Begin*********/ 
    long long n, m; 
    scanf(&#34;%lld%lld&#34;, &n, &m); 
    if(n < 0 || m < 0) 
        printf(&#34;Input Error\n&#34;); 
    else 
        printf(&#34;%lld %lld\n&#34;, gcd(n, m), lcm(n, m)); 
    /*********End**********/  
    return 0; 
} 
 
1.编辑与调试  2.顺序结构  3.选择结构一  4.选择结构二  5.循环一  6.循环二  7.函数 
8.递归与嵌套函数  9.一维数组和二维数组  10.字符数组  11.指针一  12.指针二  13.结构体  
14.文件 |   
 
 
 
 |