上个博客 http://t.csdn.cn/b5bIt 初步了解了条件语句与循环语句的结构,这篇博客进行实战练习
目录
实战一:n的阶乘
实战二:阶乘的加和
实战三:使三个数倒序排列
实战四:输出1到100以内能被三整除的整数
实战五:求最大公约数
实战六:求闰年
实战七:找素数(难)
实战八:判断1~100内有几个9(99按两个9计数)
实战九:分数求和
实战十:9*9乘法口诀表
#include //n的阶乘
int main()
{
int i=0;
int n=0;
int ret=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
ret=ret*i;
}
printf("ret=%d",ret);
return 0;
}
#include//答案是错误的:15
int main()
{
int i=0;
int n=0;
int ret=1;
int sum=0;
for(n=1;n<=3;n++)
{
for(i=1;i<=n;i++)
{
ret=ret*i;
}
sum=sum+ret;
}
printf("sum=%d",sum);
return 0;
}
注意事项:
第一个程序出现错误是对两个for循环嵌套不理解,3的阶乘+2的阶乘+1的阶乘=9,但输出却为15,具体原因
1.ret=1*1=1
2.ret=1*1*1*2=2
3.ret=1*1*1*2*1*2*3=12
所以解决办法为在第一个和第二个for循环之间, 重置ret=1
优化代码
上面代码虽然便于理解,但还是去有些繁琐重复效率不高,具体解释为每次都得重复画底线的部分
#include//优化后
int main()
{
int n=0;
int ret=1;
int sum=0;
for(n=1;n<=3;n++)
{
ret=ret*n;
sum=sum+ret;
}
printf("sum=%d",sum);
return 0;
}
#include
int main()
{
int a=0,b=0,c=0;
scanf("%d %d %d",&a,&b,&c);
//算法实现:a,b,c大小一次递减
if(a
注意事项:输入三个数时中间要加空格,否则计算机会以为是一个多位数,例4 1 3而不是413
#include//被三整除
int main()
{
int i=0;
for(i=1;i<=100;i++)
{
if(i%3==0)
printf("%d ",i);
}
return 0;
}
提示:%是取余数的意思,例7➗3=2…1故7%3=1
使用的方法是辗转相除法
例如:假如需要求 100 和18 两个正整数的最大公约数,是这样进行的:
100 / 18 = 5 (余 10)
18 / 10= 1(余8)
10 / 8 = 1(余2)
8 / 2 = 4 (余0)
至此,最大公约数为2
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 100 和 18 的最大公约数2。
最小公倍数求法:
原来的两个整数相乘,再除以最大公约数
例如:100✖️18➗2
#include//求最大公约数
int main()
{
int m=24;
int n=18;
int r=0;
while(m%n)//若非0则为真,继续循环
{
r=m%n;
m=n;
n=r;
}
printf("%d",n);
return 0;
}
一点建议:while(m%n)和下面的r=m%n;重复计算了m%n无疑重复效率底下,优化后如下
#include//求最大公约数优化
int main()
{
int m=24;
int n=18;
int r=0;
while(r=m%n)
{
m=n;
n=r;
}
printf("%d",n);
return 0;
}
#include//求闰年
int main()
{
int year=0;
int count=0;
for(year=1949;year<=2022;year++)
{
if(year%4==0&&year%100!=0)
{
count++;
printf("%d ",year);
}
if(year%400==0)
{
count++;
printf("%d ",year);
}
}
printf("\n闰年的个数是%d",count);
return 0;
}
闰年判断条件同时满足:
1、能被4整除且不能被100整除
2、能被400整除
我们分多步骤进行讲解
素数概念:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
我们的思路是试除法,定义一个整数i=13,再产生2到12内的所有整数,让前者与后者取模,能整除的(14%7=0)就不为素数,要舍去。当然素数求解的方法有很多,这只是对其中的一种进行剖析
#include//过程一
int main()
{
int i=13;
int j=0;
for(j=2;j
这个代码其实是有bug的,如果i≠13,而是一个合数14…,照样能输出,问题就出在循环上
跳出循环,输出i值有两种方式。
第一种:若是一个素数,例如,13试遍了2到12内的所有数都不能整除就会跳出循环,接着打印i的值。
第二种:若是一个合数,例如14能被2整除,直接进行if条件判断的break环节,之后跳出for循环,接着打印i的值
知道了这两种方式,我们就应该想办法排除第二种打印i值的情况。
#include//过程二
int main()
{
int i=13;
int j=0;
for(j=2;j
只判断一数字是否是素数,这显然不够,接下来创建循环产生1~100以内的数
#include//过程三
int main()
{
int i=0;
int j=0;
for(i=1;i<=100;i++)
{
for(j=2;j
优化代码
当一个数是素数时,例如17,如果按照如上算法,则需要试验2~16内的所有数,且素数越大,计算次数越多,难道2~8之内不行吗?这直接减少一半运算量
#include//过程四
#include//sqrt开平方的库函数
int main()
{
int i=0;
int j=0;
int count=0;
for(i=1;i<=100;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
break;//跳出第二个for循环
}
if(j>sqrt(i)&&i!=1)
{
count++; //两条及以上的语句需要加括号
printf("%d ",i);
}
}
printf("\ncount=%d",count);
return 0;
}
#include
int main()
{
int i=0;
int count=0;
for(i=1;i<=100;i++)
{
if(i%10==9)//个位为9
{
count++;
printf("%d ",i);
}
if(i/10==9)//十位为9
{
count++;
printf("%d ",i);
}
}
printf("\ncount=%d",count);
return 0;
}
计算1/1-1/2+1/3-1/4......+1/99-1/100
知识储备:
c语言中+=是代表两个变量相加,并将答案记录在左边的变量里。
比如x+=y实际代表的表达式为:x=x+y。
#include
int main()
{
int i=0;
int sum=0;
for(i=1;i<=100;i++)
{
sum+=1/i;
}
printf("%d",sum);
return 0;
}
我们现在运行程序,发现结果为1。这就是计算机和我们理解的偏差,例如1/1=1 但之后的1/2=0……,原因在于“/”是取商符号,要想得到小数,必须等号两段有一端是浮点数
#include
int main()
{
int i=0;
double sum=0;
int N=1;//为相反数做准备
for(i=1;i<=100;i++)
{
sum+=N*1.0/i;//i已经是整形
N=-N;
}
printf("%lf",sum);
return 0;
}
知识储备:
%2d以两位数的形式输出,若为一位数则向右对齐。
%-2d以两位数的形式输出,若为一位数,则向左对齐。
#include
int main()
{
int i=0;
int j=0;
for(i=1;i<=9;i++) //行
{
for(j=1;j<=i;j++)//列
{
printf("%d*%d=%-2d ",i,j,i*j);
}
printf("\n");
}
return 0;
}
效果如图
谢谢光顾