1 实验3_13_最大公约数和最小公倍数 (100 分)
已知两个正整数m和n,求其最大公约数和最小公倍数。
输入格式:
两个用空格分隔的正整数m和n。
输出格式:
只有一行,为两个用空格分隔的正整数,依次代表m和n的最大公约数和最小公倍数。测试用例保证m、n及其最小公倍数可以用int存储。
输入样例:
12 36
输出样例:
12 36
#include<stdio.h>
int main()
{
int m=0,n=0,i=0,a=0,b=0,c=0,x=0,t=0;
scanf("%d %d",&m,&n);
a=n;
b=m;
if(m==n)
{
printf("%d %d",m,n);
}
else
{
if(n>m)
{
t=m;
m=n;
n=t;
}
x=m%n;
if(x!=0)
{
for(;x!=0;x=m%n)
{
m=n;
n=x;
}
c=b/n*a;//先b*a再/n有可能超出int类型,所以先除再乘
}
else
{
c=m;
}
printf("%d %d\n",n,c);
}
}
//20220113
#include <stdio.h>
int main(){
int m,n,a,b;
scanf("%d %d",&m,&n);
b=m*n;
//b使用int的话会溢出,所以得用longlong,或者:在最后写成b/n*a,先除再乘,不会溢出int啦
//辗转相除法求最小公因数
while (m%n!=0){
a=m%n;
m=n;
n=a;
}
//最小公倍数等于两数乘积除以最大公因数
b/=n;
printf("%d %d",n,b);
}
2 实验4_1_韩信点兵 (100 分)
韩信有一队兵,他想知道一共有多少人,便让士兵排队报数。站5人一排,多出1人;站6人一排,多出5人站;7人一排,多出6人;站11人一排,多出10人。问韩信至少有多少兵?
输入格式:
为一个整数n(0<n<10000)。
输出格式:
一个不小于n的整数,为韩信可能拥有兵的数量的最小值。
输入样例:
200
输出样例:
461
#include<stdio.h>
int main()
{
int n,x,flag=1;
scanf("%d",&n);
for(x=n;flag==1;x++)
{
if(x%5==1&&x%6==5&&x%7==6&&x%11==10)
{
flag=0;
}
}
printf("%d",x-1);//在最后一次循环的时候x又自增了1,所以在结果处需要-1
}
3 实验4_2_圆的切分 (100 分)
在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。
输入格式:
只有一个整数n(0<=n<100)。
输出格式:
只有一个整数,为圆被n条直线分成的区域的块数。
输入样例:
1
输出样例:
2
//思路一:通项公式
#include<stdio.h>
int main()
{
int n,line;
scanf("%d",&n);
line=(2+n)*(n-1)/2+2;//如果拆开算n*n/2+n/2+2,比如遇到n=1时,n*n/2=0,不是二分之一,结果就错了
printf("%d",line);
}
//思路二:递推公式
#include<stdio.h>
int main()
{
int a,b=1,n=1;
scanf("%d",&a);
while(n<=a)
{
b+=n;
n++;
}
printf("%d\n",b);
return 0;
}
4 实验4_3_回文数 (100 分)
回文是指正读和反读都一样的数或文本段。例如,12321、55555、45554、11611都是回文数。输入一个长度不超过10位的整数n,判断它是否是回文数。
输入格式:
只有一个整数n,即待判断的数字。测试用例保证n可以用int存储。
输出格式:
当n为回文数时输出“Yes”,否则输出“No”。
输入样例:
12321
输出样例:
Yes
//求逆序数后,比较是否相等
#include<stdio.h>
int main()
{
int i=0, num,n=0,origin=0;
scanf("%d",&num);
i=num;
while(i)
{
n=n*10+i%10;
i/=10;
}
if(num==n)
{
printf("Yes");
}
else
{
printf("No");
}
}
//掐头去尾,逐对儿比较
#include <stdio.h>
#include <math.h>
int main() {
int x, n, m, a, b, p;
scanf("%d", &x);
m = x;
while (m > 0) {
m /= 10;
n++;
}
while (n > 1) {
p = pow(10, n - 1);
a = x % 10;
b = x / p;
if (a != b) {
printf("No\n");
break;
} else {
x = x % p / 10;
n -= 2;
}
}
if (n <= 1)
printf("Yes\n");
return 0;
}
5 实验4_4_进制转换一 (100 分)
已知一个只包含0和1的二进制数,二进制数的长度不大于10。你的任务是将其转换为十进制数并打印出来。 提示:用除法和求余运算每次从右到左获取二进制整数的各位数字。在十进制数值系统中,最右边的数字是个位,个位的左边依次是十位、百位、千位等等。与之类似,在二进制数值系统中,最右边的数字是1位,左边的数字依次为2位、4位、8位等等。十进制数234可分解为,二进制数1101可分解为,它等价于十进制数1+0+4+8,即13。
输入格式:
为一个只包含0和1的整数n(长度不超过10位),代表二进制数。
输出格式:
为转换得到的十进制数。
输入样例:
11111
输出样例:
在这里给出相应的输出。例如:
31
#include <stdio.h>
#include<math.h>//pow函数要用,不要忘记引用
int main()
{
int n,now,num,len=1,i,storage,decimal=0;
scanf("%d",&num);
storage=num;
while(num!=0)
{
len++;
num/=10;
}
for(i=0;i<len;i++,storage/=10)
{
now=storage%10;
decimal+=now*pow(2,i);
}
printf("%d",decimal);
}
//20220113与之前版本思路一致,但是代码更加优美简洁
#include <stdio.h>
int main(){
int binary,result=0,wei=1;
scanf("%d",&binary);
while (binary>0)//完全可以代替求位数的步骤
{
result+=binary%10*wei;
wei*=2;//完全可以代替pow函数
binary/=10;
}
printf("%d",result);
}
6 实验4_5_求幂值 (100 分)
编写一个程序,用下面的公式计算ex的值。
1)对于项 ,随着n的增大,会渐渐趋向于0。因此可以假设当项 <1e-8时,循环终止。1e-8即为10的-8次方。
2)如何求x的绝对值:使用库函数fabs(x),其中x是浮点数,返回结果也是浮点数。如判断|f|是否接近于0可以这么写:if(fabs(f)<1e-8)。
3)如何检验运行结果是否正确:标准库函数exp(x)用来求e的x次幂,其中x是浮点数,返回值也是浮点数。同学可以通过比较自己程序计算结果和标准函数exp(x)的计算结果是否一致来检验自己程序的正确性。如写上这条语句:“printf("%.4lf\n",exp(x));”。建议程序中的数据一律使用double型变量。
输入格式:
只有一个浮点数x,即代表ex中的指数x,且x满足x<=20。
输出格式:
只有一个浮点数,即ex的值,保留4位有效数字。
输入样例:
3.7
输出样例:
40.4473
#include<stdio.h>
#include<math.h>
int main()
{
double result,now,x,n=0,factorial=1,flag=1,t,q;
scanf("%lf",&x);
for(result=0,now=0;flag;n++)
{
t=n;
q=n;
for(factorial=1;t>0;t--)//只能利用每次进循环被重新刷新的t、q来代表n值用于两次循环,不可把n的原值修改了,否则无法正常递增运算了
{
factorial*=t;
}
now=pow(x,q)/factorial;
if(fabs(now)>1e-8)
{
result+=now;
}
else
{
flag=0;
}
}
printf("%.4lf\n",result);
}
//20220113
#include <stdio.h>
#include <math.h>
int main(){
double result=0,x,particular=1,n=1;
scanf("%lf",&x);
while (fabs(particular) > 1e-8){
result+=particular;
particular=particular*x/n;
n++;
}
printf("%.4lf",result);
}