目录
1.打印1-100以内3的倍数
使用for循环;if语句判断是否能被3整除;打印
int main() { int i = 0; for (i = 1; i <= 100; i++) { if (i % 3 == 0) { printf("%d ", i); } } return 0; }
或者,按字面意思:1-100以内3的倍数,打印
int main() { int i = 0; for (i = 1; 3*i <= 100; i++) { printf("%d ", 3*i); } return 0; }
2.写代码将三个整数按从大到小输出
1.有三个整数,定义a、b、c,并且让其可输入
2.从大到小输出:作比较--我们用替换的方法,让最大的在a,较大的在b,最小的在c
因为是替换,我们可以在另外找一个符号暂时存放需要换掉的数字,我这里用的是tmp
3.作比较:我们可以先a与b比,如果a>b,不变;如果a<b,就把a拿出来放在tmp的位置上,把b拿出来放在a上,再把tmp里面的数字放在b上,以此类推……
代码如下:
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d",&a,&b,&c);
int tmp = 0;
if (a < b)
{
tmp = a;
a = b;
b = tmp;
}
if (a < c)
{
tmp = a;
a = c;
c = tmp;
}
if (b < c)
{
tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d\n", a, b, c);
return 0;
}
3.试除法:打印100-200之间的素数
首先,我们要知道:素数是只有1和它本身能整除它,其他不能整除,如:1、3、5、7、11、13……
1.先定义一个字母为素数,我用字母“ i ”,还要求 求100-200之间的素数,就要先有100-200之间的数,这里使用for循环最方便。
2.判断是否为素数,我们只需要用 i 与 2 ~ (i-1) 的数字相除,如果不能整除就为素数。但是,我们要产生2~(i-1)的数字,定义为“ j ”,用一个 for循环 产生2 ~ (i-1) 的数字。
3.再用 if语句 ,如果 i % j == 0,那就说明能整除不是素数,这个数字不能要,我们要打印的是除了这些数字的其他数字,可以定义一个标记flag。一开始 flag=1,当他可以整除,flag=0;break;跳出。在代码的最后用 if语句 ,flag == 1的打印出来。
代码如下:
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;//假设是素数
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)//判断能不能整除
{
flag = 0;//能整除,不是素数
break;//跳出
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
很显然,这个方法虽然能做,但是还是啰嗦了点,我们可以改良一下:
当一个数m可以用 m=a*b 表示时,a和b中至少有一个数小于等于。
例如:16,16=4*4 或 16=2*8;
举个反例:11,数字11就只能1*11=11;
知道了这个原理,我们就会发现:其实没有必要从 2 开始除到 i-1 ,只需要除到。
又因为开平方出来的数字不一定是整数,所以我们强制变一下。
利用这个原理,我们可以修改一下:
用一下开平方的库函数sqrt( ),头文件是#include<math.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;
int j = 0;
for (j = 2; j <= (int)sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
4.打印1000-2000之间的闰年
我们要知道闰年怎么判断:能被4整除,并且不能被100整除的年份是闰年;能被400整除也是闰年,我们动手操作一下:
代码1:
int main() { int y = 0; for (y = 1000; y <= 2000; y++) { if (y % 4 == 0) { if (y % 100 != 0) { printf("%d ", y); } } if (y % 400 == 0) { printf ("%d ", y); } } return 0; }
代码2:
int main() { int y = 0; for (y = 1000; y <= 2000; y++) { if (y % 4 == 0) { if (y % 100 != 0) { printf("%d ", y); } } else if (y % 400 == 0) { printf ("%d ", y); } } return 0; }
细心的小伙伴能发现我这两个代码只有一处不同,就是 else if ,那么这两个代码究竟有什么不同呢?我们调试一下看看:
代码1:
代码2:
我们不需要仔细去数,看最后一个就能看到第一个有2000年,而第二个没有。
这里很容易解释的:就是其实他是两个判断标准,如果你用else if后这就变成一个标准了。
当一个年份进入第一个if语句后,不会再进入 else if 中;但是他会进入下一个 if语句 中。
所以,代码2是错误的!
这里我们也可以简单点写,之前讲过操作符 并且“&&” 和 或者“||” ,我们可以用到这道题目上。
int main()
{
int y = 0;
for (y = 1000; y <= 2000; y++)
{
if (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))
{
printf("%d ", y);
}
}
return 0;
}
这里 if 的条件有点复杂,其实就是一个 if 原有的()里面有两个(),其中第一个()里面有两个条件所以再嵌套一个():( ( (条件1) && (条件2) ) || (条件3) )
5.求两个数的最大公约数
最大公约数就是一个 最大的 能整除这两个数字 的数字。
因此,这个最大公约数肯定不能比这两个数字中的较小值要大吧,所以我们可以从较小值开始往下排除。
这里需要一个循环,我们可以用while循环就很方便,while(1)让它死循环的走。循环中间有一个条件:这两个数都要能被整除。
可能有伙伴找较小值就卡住了,还记得之前讲过的操作符吗?
这次我们可以使用 ( m > n ? n : m ) m如果大于n,较小值为n,否则为m
int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); int k = (m > n ? n : m);//设为最大公约数 while (1) { if (m % k == 0 && n % k == 0) { break; } k--;//试错 } printf("%d\n", k); return 0; }
这个方式还是有点啰嗦了,给大家介绍一个新方法:
辗转相除法
可以看到这种方法更高效,代码如下:
int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); int k = 0;//余数 while (k = m % n) { m = n; n = k; } printf("%d\n", n); return 0; }