2021计算导论第六次练习题目

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条直线相交于一点,试问这些直线将圆分成多少区域。 

c.jpg

输入格式:

只有一个整数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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值