diff --git a/report2.md b/report2.md index ed607ee84d240c1916f314b1013251ea7aa1fed8..08999ea3ec3f4b9a1861dac95b816046331a9fa4 100644 --- a/report2.md +++ b/report2.md @@ -20,51 +20,372 @@ -## 问题1: - +## ### 1. 问题陈述 +整数的特殊性质 +### 2. 输入、输出描述 +给定一个正整数 n,判断这个数是否具一系列特殊性质,如:奇数(odd number)、偶数(even number)、素数(prime number)、完数(perfect number)、回文数(palindrome number)和水仙花数(narcissistic number)。 -### 2. 输入、输出描述 +### 3. 演算示例 +输入 1: +1 -### 3. 演算示例 +输出 1: + +odd = YES +even = NO +prime = NO +perfect = NO +palindrome = YES +narcissistic = NO + +输入 2: + +、2 + +输出 2: + +odd = NO +even = YES +prime = YES +perfect = NO +palindrome = YES +narcissistic = NO + +输入 3: + +6 + +输出 3: + +odd = NO +even = YES +prime = NO +perfect = YES +palindrome = YES +narcissistic = NO +输入 4: + +121 + + +输出 4: + +odd = YES +even = NO +prime = NO +perfect = NO +palindrome = YES +narcissistic = NO + +输入 5: + +153 + +输出 5: + +odd = YES +even = NO +prime = NO +perfect = NO +palindrome = NO +narcissistic = YES ### 4. 算法设计 +1.算法总体描述: +step1: 输入一个数字 +step2: 判断这个数字是否符合这些特征 +step3:输出结果 +2.程序代码 +```c +#include //头文件 -### 5. 测试 +#include + +int main(void) + +{ + + int n; + + scanf("%d",&n); //输入数字 + + if (n % 2 == 0) //如果是偶数 + + + + printf("odd = NO\neven = YES\n"); //输出不是奇数同时是偶数 + + else + + printf("odd = YES\neven = NO\n"); //不是偶数就是奇数输出奇数的结果 + + int s; + + int d; + + if (n <= 1) { //素数是指在大于一的自然数中除了1和它本身以外不在有其他因的自然数,所以小于1一定不是素数 + + printf("prime = NO\n"); + +} else { + + s = (int) sqrt(n); //看自然数的因数把它开平方看前面就行 + + for (d = 2;d <= s;d++) + + if (n % d == 0) + + break; //如果它有其他因式break + + if (d <= s) + + printf("prime = NO\n"); //循环结束如果d <= s说明有其他因式 + + else + + printf("prime = YES\\n"); //否则代表它没有其他因式就是素数 + +} + +if (n == 6 || n == 28 || n == 496) //正整数表示范围内的完数有6,28,496如果不是这些数字那就不是完数 + +printf("perfect = YES\\n"); + +else + +printf("perfect = NO\\n"); + +int x = 0; //回文数是指从左往右和从右往左读都是一样的数字 + +do { + + x++; + n = n / 10; +} while (n != 0); //x表示n的位数 + +int sum = 0; + +while (n != 0) { + + + + int m = x - 1; //m = 位数减1 + + sum += n % 10 * pow(10,m); //最后一位到第一位 + + m--; + + n = n / 10; + +} //最后sum为倒序的数字n + +if (sum == n) //如果sum与n 相等说明它就是回文数 + +printf("palindrome = YES\\n"); + +else //不相等就不是回文数 + +printf("palindrome = NO\\n"); + +int nb = 0; //水仙花数是个位数字的立方和相加等于n + +while (n != 0) { + + + + nb += n % 10 \* (n % 10) \* (n % 10); //nb加上每位数字的立方和 + + n /= 10; + +} + +if (nb == n) //如果nb等于n 说明是水仙花数 + +printf("narcissistic = YES\\n"); + +else + //否则不是水仙花数 +printf("narcissistic = NO\\n"); + + + +return 0; //return 0 程序结束 +} + +``` + +### 5. 测试 + +测试结果与示例相符则程序正确 ### 小结 +运用多次选择结构; +运用多次判断结构; ## 问题2: - +经典递归问题 ### 1. 问题陈述 +所谓递归,是指一个函数调用自己。 +请编程实现几个经典的递归函数。 -### 2. 输入、输出描述 +(1)阶乘 + +fact(n)={ +1, n≤1, +n×fact(n−1), n>1.} +​ + + + +​ + + +(2)自然数的和 + +sum(n)={ +1, n=1, +n+sum(n−1), n>1.} +​ + + + +​ + + +有人说 1+2+3+⋯=− +12 +1 +​ + ,可惜计算机没法验证它 :-) + +(3)斐波那契数列 + +3)斐波那契数列 + {0, n = 0; +fib(n)= {1, n = 1; + {fib(n-1)+fib(n-2) n > 1; + + + +​ + + +(4)快速幂 + +power(x,n)= {1 n=0; + {x n=1; + {power(x*x,n/2) n>2 n是偶数; + {x * power(x,n-1) n>2 n是奇数; + +​ + + +(5)最大公约数 + +gcd(m,n)={m, n=0; + {gcd(n,m%n), n!=0; + + + + +### 2. 输入、输出描述 +无输入输出就是定义几个函数 + ### 3. 演算示例 +函数原型如下: +```c +// 递归计算 n 的阶乘 +long long fact(int n); +// 递归计算 1+2+...+n +int sum(int n); +// 递归计算斐波那契数列第 n 项 +int fib(int n); +// 递归计算 x 的 n 次幂 +double power(double x, int n); +// 递归计算 m 和 n 的最大公约数 +int gcd(int m, int n); +``` + +程序运行结果: +```c +fact(20) = 2432902008176640000 +sum(100) = 5050 +fib(40) = 102334155 +power(3.14159, 100) = 5.18741E+49 +gcd(9527, 6553) = 1 +``` ### 4. 算法设计 +代码如下: +```c +#include //声明头文件 + +fact(n) +{ + if (n <= 1) + return 1; + else + return n * fact(n - 1); +} +sum(n) +{ + if (n == 1) + return 1; + else + return n + sum(n - 1); +} +fib(n) +{ + if (n == 0) + return 0; + else if (n == 1) + return 1; + else + return fib(n - 1) + fib(n - 2); +} +power(x,n) +{ + if (n == 0) + return 1; + else if (n == 1) + return x; + else if (n > 2 && n % 2 == 0) + return power(x * x,n / 2); + else + return x * power(x,n - 1); +} +gcd(m,n) +{ + if (n == 0) + return m; + else + return gcd(n,m % n); +} +```