333333333
实验课因为熬夜了所以脑子乱哄哄的……
因为昨天有事昨天就没发……
!!!每次写之前我都会整理一下自己的代码,想一想可不可以用别的方法写,会不会更清晰简单,然后我发现其实这样子真的超有用!!!!
出现的新玩意:数组(D),递归法(A)
【id:171】【20分】A. 公约公倍
其实就是使用辗转相除法得到最大公约数,再用最大公约数求最小公倍数就好了
关于辗转相除法的举例和一般代码:
如求12与8的最大公约数:
设tmp;
令tmp = 12 % 8 = 4
发现4 != 0
于是令tmp = 8 % 4 = 0
发现tmp == 0:此时的4就是12与8的最大公约数
int gcd(int m, int n) {//辗转相除法求最大公约数
int tmp;
while (n != 0) {
tmp = m % n;
m = n;
n = tmp;
}
return m;
}
下面的代码则是在辗转相除法的思想上使用了递归法:(可以用上面的一般代码帮忙理解逻辑)
#include <stdio.h>
/* 递归法 */
int gcd(int m, int n) {//辗转相除法求最大公约数
if (n == 0)
return m;
else
gcd(n, m % n);
}
int lcm(int m, int n) { //利用最小公约数求最小公倍数
int t = (m * n) / gcd(m, n) ;
return t;
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
printf("%d %d", gcd(m, n), lcm(m, n));
return 0;
}
【id:237】【20分】B. 欧拉函数
思路:求两个数的最大公约数是否是1就可以了
#include <stdio.h>
int gcd(int m, int n) {//辗转相除法求最大公约数
if (n == 0)
return m;
else
gcd(n, m % n);
}
int f(int n) { //计算互质的数数目
int y = 0;
for (int i = 1; i < n || n == 1 && i == 1; i++) { //“||”后的条件是特判当n输入为1时的情况
if (gcd(n, i) == 1) {
y++;
}
}
return y;
}
int main() {
int T, n;
scanf("%d", &T);
for (; T > 0; T--) {
scanf("%d", &n);
printf("%d\n", f(n));
}
return 0;
}
这次的作业都需要特别注意一下特殊值……
【id:83】【20分】C. 亲和数(函数)
#include <stdio.h>
int sum(int a) { //计算真约数之和
int y = 0;
for (int n = 1; n < a; n++) {
if (a % n == 0) //如果为真约数就加上去
y += n;
}
return y;
}
int amicable_number(int a, int b) { //比较和判断是否是亲和数
if (a != b && (sum(a) == b && sum(b) == a)) //因为样例选取的问题,第二个&&就算写成||也会ac
return 1;
return 0;
}
int main() {
int n, a, b;
scanf("%d", &n);
for (; n > 0; n--) {
scanf("%d %d", &a, &b);
if (amicable_number(a, b))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
【id:389】【20分】D. 实验5-10 使用函数统计指定数字的个数
考点和期中考的HowAreYou题有点像好像,下面分为普通版和数组版,这次用数组真的会变得很简单!!
普通版:
#include <stdio.h>
#include <math.h>
int countdigit(int num, int dig) {
int t, i = 0;
num = abs(num);
if (num == 0 && dig == 0) //特判输入“0 0”的情况,不然num=0进不去下面循环
i++;
while (num >= 1) {
t = num % 10; //取出并保存num最后一位数字
num /= 10;
if (t == dig)
i++;
}
return i;
}
int main() {
int num, dig;
scanf("%d %d", &num, &dig);
printf("Number of digit %d in %d: %d", dig, num, countdigit(num, dig));
return 0;
}
一个小小的要区分的点:
函数abs()用于将整数型的数字变为绝对值,会返回一个整数类型的数
而函数fabs()用于将浮点型的数字变为绝对值,会返回一个浮点类型的数
使用他们都需要引入<math.h>库
数组版:
#include <stdio.h>
#include <string.h> //使用strlen()函数需要他
int countdigit(char num[1005], int dig) {
int l = strlen(num);
int i = 0;
for (l--; l >= 0; l--) { //第一个用i--是因为数组从0开始
if (num[l] == dig)
i++;
}
return i;
}
int main() {
char num[1005], dig;
scanf("%s %c", &num, &dig);
printf("Number of digit %c in %s: %d", dig, num, countdigit(num, dig));
return 0;
}
使用数组后就不需要再将数字变为绝对值啦,只需要一个一个位数的取出来判断是否跟digit相同就可以啦
strlen()函数可以返回数组的大小,使用他需要引入<string.h>库(使用%s读入很长的字符串也需要引入他)
【id:393】【20分】E. 实验5-6 使用函数求素数和
#include <stdio.h>
int prime(int m) {
if (m == 1)
return 0;
for (int n = 2; n < m && m != 2; n++) { //套用标准的判断素数for循环……
if (m % n == 0) //一旦发现不是素数就狠狠的返回0
return 0;
}
return 1;
}
int main() {
int m, n, y = 0;
scanf("%d %d", &m, &n);
printf("Sum of ( ");
for (; m <= n; m++) {
if (prime(m)) {
y += m;
printf("%d ", m);
}
}
printf(") = %d", y);
return 0;
}
怎么样判断素数感觉大家应该都很熟了……
写的有点赶就没写太多……
去吃饭了,发布!