「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章!
各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!
10.求最大公约数 Common divisor
方法1:暴力求解
最大公约数:可能是二者中的最小值,
所以用两数中的最小值不断减1 试除
//法一
int main()
{
int m = 0;
int n = 0;
int min = 0;
scanf("%d %d", &m, &n);
min = m < n ? m : n; //求两数中的最小值
while (min)
{
if (m % min == 0 && n % min == 0)
{
printf("%d和%d的最大公约数为:%d\n",m, n, min);
break;
}
min--;
}
return 0;
}
复制代码
方法2:辗转相除法
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m,&n);
int r = 0;
//辗转相除法
while (r = m %n)
{
m = n; //将n的值赋给m
n = r; //将余数赋给n
}
printf("%d\n", n);
return 0;
}
复制代码
11.求最小公倍数 Common multiple
法1:暴力求解
最小公倍数:可能是二者中的最大者
只需要+1往下试即可
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int max = n > m ? n : m; //二数中的最大者
while (1)
{
if (max % n == 0 && max % m == 0)
{
printf("%d %d的最小公倍数为:%d\n", n, m, max);
break;
}
max++;
}
return 0;
}
复制代码
方法2:最小公倍数 = 两数之积/最大公约数
//求最大公约数
int MaxCommonDivisor(int m,int n)
{
int r = 0;
//辗转相除法
while (r = m % n)
{
m = n; //将n的值赋给m
n = r; //将余数赋给n
}
return n;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = MaxCommonDivisor(m, n);
printf("%d %d 的最小公倍数为:%d,最大公约数为:%d\n", m, n, m * n / ret,ret);
return 0;
}
复制代码
12.程序题:判断1000-2000年中的闰年
闰年:
1.能被4整除,不能被100整除 &&
2.能被400整除 ||
复制代码
int main()
{
int year = 0;
int count = 0; //计数
for (year = 1000; year <= 2000; year++)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
count++;
printf("%d ", year);
}
}
printf(" \n1000年到2000年中,闰年个数为:%d\n",count);
return 0;
}
//count:243
复制代码
//也可以写成
int main()
{
int count = 0;
int year = 0;
for(year = 1000; year <=2000;year++)
{
if (year % 4 == 0 && year % 100 != 0)
{
count++;
printf("%d ", year);
}
else if (year % 400 == 0)
{
count++;
printf("%d ",year);
}
}
printf(" \n1000年到2000年中,闰年个数为:%d\n", count);
return 0;
}
//count :243
复制代码
错误写法
//错误写法
int main()
{
int count = 0;
int year = 0;
for(year = 1000; year <=2000;year++)
{
if (year % 4 == 0 )
{
if(year % 100 != 0)
{
count++;
printf("%d ", year);
}
}
else if (year % 400 == 0)
{
count++;
printf("%d ",year);
}
}
printf(" \n1000年到2000年中,闰年个数为:%d\n", count);
return 0;
}
//count :240
//少了三个年份:1200 1600 2000
//原因:进入了if 就不进入 else if 满足y%4==0 就进入if ,但是后面的else if就不进入了,所以造成了缺少三个年份
复制代码
13.程序题:打印100-200之内的素数
法1:试除法
素数:除了1和本身之外,不能被其他数整除
判断i是否为素数:拿2到i-1的数字试除i
//写法1:
//是素数返回1,不是素数返回0
int is_prime(int n)
{
int i = 0;
for (i = 2; i < n; i++)
{
if (n %i == 0)
{
return 0;
}
}
return 1;
}
//写法2
//用布尔类型 ->引用头文件 stdbool.h
bool is_prime(int n)
{
int i = 0;
for (i = 2; i < n; i++)
{
if (n %i == 0)
{
return false;
}
}
return true;
}
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
if (is_prime(i) == 1)
{
count++;
printf("%d ", i);
}
}
printf("\n100-200之间的素数个数为%d个\n", count);
return 0;
}
//100-200之间的素数个数为21个
复制代码
方法2:开平方
如果 m = a*b a和b至少有一个数字是<= sqrt(m)
例如:16 = 2*8 = 4*4
只要有一个数能把m整除了就不用判断另一个了
所以只要试除到开平方m即可
sqrt() ->开平方函数 引用头文件math.h
复制代码
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1; //假设为素数
int j = 0;
//试除到开平方i
for (j = 2; j <=sqrt(i); j++)
{
if (i % j == 0)
{
//被整除了,说明不是素数
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n100-200之间的素数个数为%d个\n", count);
return 0;
}
复制代码
法3:优化
素数只在奇数中产生,所以可以从101开始。每次+=2
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
int flag = 1; //假设为素数
int j = 0;
//试除到开平方i
for (j = 2; j <=sqrt(i); j++)
{
if (i % j == 0)
{
//被整除了,说明不是素数
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\n100-200之间的素数个数为%d个\n", count);
return 0;
}
复制代码
14.程序题:求10个数的最小值和最大值
//错误程序
//原因:取min和max为0,若我们输入时为负数,则最大值会出错
int main()
{
int arr[10] = { 0 };
int i = 0;
// 为数组输入元素
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int max = 0;
int min = 0;
for (int i = 0; i < 10; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i] < min)
{
min = arr[i];
}
}
printf("min=%d max=%d", min, max);
return 0;
}
复制代码
//正解
//假设数组中的某一个元素为最小值。最大值
int main()
{
int arr[10] = { 0 };
int i = 0;
// 为数组输入元素
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int max = arr[0];
int min = arr[0];
for (int i = 0; i < 10; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i] < min)
{
min = arr[i];
}
}
printf("min=%d max=%d", min, max);
return 0;
}
复制代码
近期评论