小伙伴们大家好,今天我们继续来练习循环的两道题目,这两道题可以说是非常经典,一道题是素数求和,另一道题则是求两个数字的最大公因数和最小公倍数,极其适合新手思考,接下来,我们就一起做一下吧。
注意:给大家说一下本篇内容的使用方法
1 . 如果会 for 循环和 while 循环和 if 分支判断,先自己想办法做题 | 如果不会就先学基本语法,知道怎么用就行,大概搜一下几分钟到半个小时就知道怎么用了(注意书写规范)
2 . 如果没有思路,可以看我写的解题思路,再动手自己敲一遍代码
3 . 如果看完解题思路后将近一个小时都没有写出来,那么理解我的代码,理解之后自己写一遍
一、统计素数求和
题目1如下:
统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
1.解题思路:
如果一个数字能不被除它本身和1之外的数字整除,那么这个数字就是素数,
那么我们只需要从输入的数字 m 开始,输入的数字 n 结束,所以就有第一个循环:从 m 到 n ,
进入循环后,在让那个数字除以从 2 开始,(n - 1)结束,
如果发现有一个数字取余为 0 ,说明这个数字被整除,我们就跳出循环,开始下一个数字,如果每一个数字取余都不为0,那么这个数字就是我们要找的素数,
如果是素数循环结束后,那么此时你除以的数字是大于等于这个素数的。
(至于你还是如果不理解大于还是等于建议大家自己动手调试一遍,更清楚循环的运行)
注意:此时还没有全部结束,有一种情况你没有考虑全,那就是如果你输入的是1,那么也会自动判定为素数,所以我们要单独判断输入开始数字为1的情况。
2.代码示例:
#include <stdio.h>
int main()
{
int m = 0, n = 0, i = 0,count = 0,sum = 0;
scanf("%d %d",&m,&n);
for (i = m;i<=n;i++)
{
int j = 2;
for (j = 2;j < i;j++)
{
if (i%j == 0)
break;
}
if (j>=i)
{
count++;
sum = sum + i;
}
}
if (m == 1)
{
count = count -1; //count是用来统计素数个数的
sum = sum -1; //sum是用来统计素数和的
}
printf("%d %d\n",count,sum);
return 0;
}
二、最大公因数和最小公倍数
题目二如下 :
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
14 21
输出样例:
7 42
1 . 解题思路:
第一种:常规
如果两个数同时除以一个数字则是它们的公因数,最小公倍数则是公因数相乘
首先你并不知道输入的 m 和 n 谁大谁小,所以我们都需要写一个判断语句,通过赋值来确定谁大谁小,这两种解题思路都将m设置为最大
其次我们开始从最大数开始往下找最大公因数,只要两个都能被整除就是最大公因数,那么让这两个数m和n都除以公因数,最后m和n的值就会变小,公因数肯定是大于等于n的,那么让每个公因数相乘,包括最后的m和n,得出来的结果就是最小公倍数
第二种:辗转相除法
即两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
这里大家可以自己写写与余数的关系,翁恺c语言也讲过,而且很详细,大家可以去听听
2 . 代码示例:
第一种解题思路:
#include <stdio.h>
int main()
{
int m = 0, n = 0, i = 2, sum = 1, count = 0;
scanf("%d %d",&m,&n);
if (m < n)
{
int z = m;
m = n;
n = z;
}
for (i = m - 1;i > 1; i--)
{
if (m % i == 0 && n % i == 0)
{
m = m/i;
n = n/i;
sum = sum * i;
if (i >= n )
{
count = i;
}
}
}
sum = sum * m * n;
printf("%d %d",count,sum);
return 0;
}
第二种解题思路:
#include <stdio.h>
int main()
{
int m,n,c,m1,z;
scanf("%d %d",&m,&n);
if(m < n)
{
z = m;
m = n;
n = z;
}
m1 = m * n;
c = m % n;
while(c != 0)
{
m = n;
n = c;
c = m % n;
}
printf("%d %d\n",n,m1/n);
return 0;
}
好啦,今天练习就到这里,大家多练才能提高代码能力,自己动手很重要!
每天进步一点点,我们就会越来越好!加油呀