2023.07.26
有三个整数a,b,c,由键盘输入,输出其中的最大值。
int main()
{
int a,b,c,max;
printf("输入三个整数a b c\n");
scanf("%d %d %d",&a,&b,&c);
if (a==b)
{
max=a;
if(a==c)
{
max=a;
printf("最大值为max=a=b=c=%d",max);
}
else if(a>c)
{
max=a;
printf("最大值为max=a=b=%d",max);
}
else
{
max=c;
printf("最大值为max=c=%d",max);
}
}
else if(a>b)
{
max=a;
if(a==c)
{
max=a;
printf("最大值为max=a=c=%d",max);
}
else if(a>c)
{
max=a;
printf("最大值为max=a=%d",max);
}
else
{
max=c;
printf("最大值为max=c=%d",max);
}
}
else
{
max=b;
if(b==c)
{
max=b;
printf("最大值为max=b=c=%d",max);
}
else if(b>c)
{
max=b;
printf("最大值为max=b=%d",max);
}
else
{
max=c;
printf("最大值为max=c=%d",max);
}
}
return 0;
}
从键盘输入一个小于1000的正数,要求输出它的平方根(如果平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求其重新输入。
int main()
{
int num;
double a;
printf("输入一个小于1000的正数");
scanf("%d",&num);
if(num<=0||num>=1000)
{
printf("请重新输入一个不小于1000的正数!");
}
else
{
a=sqrt(num);
printf("该数的平方根为%.0lf",a);
}
return 0;
}
给出一百分制成绩,要求输出成绩等级为‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
int main()
{
int score;
printf("输入成绩为\n");
while(scanf("%d",&score)!=EOF)
{
if(score>=90)
printf("成绩等级为A\n");
else if(score>=80)
printf("成绩等级为B\n");
else if(score>=70)
printf("成绩等级为C\n");
else if(score>=60)
printf("成绩等级为D\n");
else
printf("成绩等级为E\n");
}
return 0;
}
给一个不多于5位的正整数,要求:
①求出它是几位数; ②分别输出每一位数; ③按逆序输出各位数字,例如原数为321,应输出123。
第①小问:使用三种循环语句书写代码
int main()
{
int num,i=0;
printf("输入一个不多于五位数的正整数",num);
scanf("%d",&num);
while(num>0)
{
num=num/10;
i++;
}
printf("该数为%d位数。",i);
return 0;
}
int main()
{
int num,i=0;
printf("输入一个不多于五位数的正整数",num);
scanf("%d",&num);
for(;num>0;i++)
{
num=num/10;
}
printf("该数为%d位数。",i);
return 0;
}
int main()
{
int num,i=0;
printf("输入一个不多于五位数的正整数",num);
scanf("%d",&num);
do
{
num=num/10;
i++;
}
while(num>0);
printf("该数为%d位数。",i);
return 0;
}
第②小问:
int main()
{
int num,a,b,c,d,e;
printf("输入一个不多于五位数的正整数",num);
scanf("%d",&num);
a=num%10;
num=num/10;
b=num%10;
num=num/10;
c=num%10;
num=num/10;
d=num%10;
num=num/10;
e=num%10;
num=num/10;
printf("个位数是%d\n",a);
printf("十位数是%d\n",b);
printf("百位数是%d\n",c);
printf("千位数是%d\n",d);
printf("万位数是%d\n",e);
return 0;
}
第③小问:
int main()
{
int num,a;
printf("输入一个不多于五位数的正整数",num);
scanf("%d",&num);
while(num>0)
{
a=num%10;
num=num/10;
printf("%d",a);
}
return 0;
}
输入4个整数,按要求由小到大的顺序输出。
int main()
{
int a,b,c,d,s;
printf("输入4个整数:");
scanf("%d %d %d %d",&a,&b,&c,&d);
while(a>b||a>c||a>d)
{
if(a>b)
{
s=a;
a=b;
b=s;
}
if(a>c)
{
s=a;
a=c;
c=s;
}
if(a>d)
{
s=a;
a=d;
d=s;
}
}
while(b>c||b>d)
{
if(b>c)
{
s=b;
b=c;
c=s;
}
if(b>d)
{
s=b;
b=d;
d=s;
}
}
while(c>d)
{
s=c;
c=d;
d=s;
}
printf("%d %d %d %d",a,b,c,d);
return 0;
}
关键:在思考这道题的解题逻辑时,我有想过几种办法,比如两两一组先比较,再大和大比,小和小比,剩下两数再比,再排布打印,但是这样写会出现需要考虑两数相等的情况。因此,我又思考了另一种办法,就是先假设a,b,c,d四数就是由小到大的,如果出现与此情况不太就进行两数相换的操作(学习时有学到),小于等于的情况就不需要更换,避免讨论相等的情况。
循环语句练习:
利用公式π/4 = 1-(1/3)+(1/5)-(1/7)+···求π的近似值,直到发现某一项的绝对值小于 e-6 为止(该项不累加)。
计算方法已经确定,要做的就是如何精确的执行这个公式求π值。要想使用循环来求,就需要先对公式里的项观察,找规律。
另外,写代码的过程中学习了新的函数:fabs是专门用来求绝对值的函数。
求绝对值的函数:
abs(x),求整数x的绝对值,结果为整型;fabs(x),求双精度数x的绝对值,结果是双精度型。
在使用数学函数时,要在本文件模块的开头加预处理指令:#include <math.h>。
#include <math.h>
int main()
{
int sign=1;
double x=1.0,PI,i=1.0,sum=0.0,e;
while(fabs(x)>=1e-6)
{
x=sign/i;
sign=-sign;
i+=2;
sum=sum+x;
}
PI=4*sum;
printf("PI的值为%lf",PI);
return 0;
}
求Fibonacci(斐波那契)数列的前40个数。这个数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,···。
int main()
{
int num_1=1,num_2=1,num_3=0,i;
printf("%d\n%d\n ",num_1,num_2);
for(i=1;i<=38;i++)
{
num_3=num_2;
num_2=num_1+num_2;
num_1=num_3;
printf("%d\n",num_2);
}
return 0;
}
输入一个大于3的整数n,判定它是否为素数(prime,又称质数)。
#include <math.h>
int main()
{
int n,i;
printf("输入一个大于3的整数");
while(scanf("%d",&n)!=EOF)
{
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0) break;
}
if(i<=sqrt(n))
printf("该数为合数。\n");
else
printf("该数是质数。\n");
}
return 0;
}
求100~200的全部素数。
#include <math.h>
int main()
{
int num,i;
for(num=100;num<=200;num++)
{
for(i=2;i<=sqrt(num);i++)
{
if(num%i==0) break;
}
if(i>sqrt(num))
printf("%d ",num);
}
return 0;
}
关键:与上一题的判断是否为素数有一些相同之处,另外的只要进行100~200之间所有数的判断,只要在外面再套一层循环语句即可。
另外:偶数不是素数,所以不必对偶数进行判定,只用对奇数进行检查。故还可以对代码进行优化,外循环变量可以从101开始,i加值为2。
优化后:
int main()
{
int n,k,i,m=0;
for(n=101;n<=199;n+=2)//对101到199之间的奇数进行判断即可
{
k=sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0) break;//如果在2到k之间有n的约数,立刻停止判断,判为合数
}
if(i>k)
{
printf("%d ",n);
m=m+1;
}
if(m%10==0) printf("\n");//对一行输出数字有要求的话,可以使用一个计数变量
}
return 0;
}
输入两个正整数m和n,求其最大公约数和最小公倍数。
int main()
{
int a,b,c,d,m,n;
printf("输入两个数");
scanf("%d %d",&a,&b);
for(m=1;m<=a;m++)
{
if(a%m==0&&b%m==0)
c=m;
}
for(n=1;;n++)
{
if(n%a==0&&n%b==0)
{
d=n;
break;
}
}
printf("他们的最大公约数为%d\n",c);
printf("他们的最小公倍数为%d\n",d);
return 0;
}
本法为穷举法,设有暂时的公约数和公倍数,因为不管是一个数的约数还是倍数,和本数之间总是存在倍数关系,求余或被求余都为0;所以运用&&符号来求两数间最大公约数,求最小公倍数的话,令内选择只成功运行一次,随即跳出循环即可。
另外,还有两种方法求最大公约数:辗转相除法和辗转相减法。
关于最大公约数和最小公倍数有这样一个公式: x*y=最小公倍数*最大公约数
这样以来求出最大公约数后就可以求出最小公倍数
辗转相除法:
int main()
{
int a,b,c,tem;
printf("输入两个数a b:");
scanf("%d %d",&a,&b);
c=a*b;
if(a<b)
{
tem=a;
a=b;
b=tem;
}
while(a%b!=0)
{
tem=a%b;
a=b;
b=tem;
}
c=c/b;
printf("%d为最大公约数\n",b);
printf("%d为最小公倍数\n",c);
return 0;
}
在写代码的过程中进行了优化,13行的 a%b==0 与 a%b!=0 两种情况,原来我是用了一个if else语句,但是学习得知,最终目的是使 a%b==0 ,所以可以先用一个while语句将所有情况下的 a%b==0 都成立,再直接进行公约数公倍数的求解,从而简化代码,运行效率更高。
辗转相减法:
int main()
{
int a = 0,b=0,c=0,count=0;
printf("输入两个数a b:");
scanf("%d %d",&a,&b);
c=a*b;
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
c=c/b;
printf("%d为最大公约数\n",b);
printf("%d为最小公倍数\n",c);
return 0;
}
大体和辗转相除法差不多,在之上进行修改即可。