• C语言百日刷题第六天


    51.鸡兔同笼问题

    在这里插入图片描述
    分析:小学生数学问题。设鸡为a个,兔为b个,建立二元一次方程组:
    可以解的: a=(4n-m)/2, b=n-a。
    但是要考虑无解的情况。当解出的a,b是小于0或者腿数位奇数的时候是不符合实际情况的。

    #include
    int main()
    {
    	int n, m;
    	int a = 0;
    	int b = 0;
    	scanf("%d %d", &n, &m);
    	a = (4 * n - m) / 2;
    	b = n - a;
    	if (m % 2 == 1 || a < 0 || b < 0)
    		printf("No answer\n");
    	else
    		printf("%d %d", a, b);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    52.输出所有形如aabb的完全平方数

    在这里插入图片描述
    判断一个数是不是完全平方数的方法?
    方法一:

    int m = floor(sqort(n)+0.5);//n是需要判断的数
    if(m*m==n)
    	printf("是完全平方数");
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    为什么要加个0.5?

    以为在大量计算的时候,可能会发生误差,由于误差可能会使1变为0.99999999999999999,但是floor会使0.9999999999的结果为0。为了不让这种情况发生,我们加上0.5,改为四舍五入。这样就可以避免以上的情况发生。

    根据方法一写出的代码:

    #include
    #include
    
    int main()
    {
    	for (int i = 1; i <= 9; i++)
    	{
    		for (int j = 0; j <= 9; j++)
    		{
    			int n = i * 1100 + j * 11;
    			int m = floor(sqrt(n) + 0.5);
    			if (m * m == n)
    				printf("%d是完全平方数\n",n);
    		}
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    方法二:

    int a = n/100;//n是需要判断的数,n/100就是前两位的数字
    int b = n%100;//n%100就是后两位数字
    if(a/10==a%10&&b/10==b%10)
    	printf("是完全平方数");
    
    • 1
    • 2
    • 3
    • 4

    根据方法二写出的代码:

    #include
    int main()
    {
    	for (int i = 1; ; i++)
    	{
    		int n = i * i;
    		if (n < 1000)
    			continue;
    		if (n > 9999)
    			break;
    		int a = n / 100;
    		int b = n % 100;
    		if (a / 10 == a % 10 && b / 10 == b % 10)
    			printf("%d是完全平方数",n);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    53.3n+1问题

    在这里插入图片描述

    #include
    int main()
    {
    	long long n = 0;
    	int count = 0;
    	scanf("%lld", &n);
    	while (1)
    	{
    		if (n % 2 == 1)
    		{
    			if (n == 1)
    				break;
    			else
    			{
    				n = 3 * n + 1;
    				count++;
    			}
    		}
    		else
    		{
    			if (n == 1)
    				break;
    			else
    			{
    				n = n / 2;;
    				count++;
    			}
    		}
    
    	}
    	printf("%d\n", count);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    54.输出100~999的所有水仙花数

    在这里插入图片描述

    #include
    int main()
    {
    	for (int i = 100; i < 1000; i++)
    	{
    		int a = i / 100;
    		int b = (i / 10)%10;
    		int c = i % 10;
    		if (i == a * a * a + b * b * b + c * c * c)
    			printf("%d\n",i);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    55.韩信点兵

    在这里插入图片描述
    在这里插入图片描述

    #include
    int main()
    {
    	int  a, b, c;
    	int sum = 0;
    	scanf("%d%d%d", &a, &b, &c);
    	for (int i = 10; i <= 100; i++)
    		if (i % 3 == a && i % 5 == b && i % 7 == c)
    		{
    			sum = i;
    			break;
    		}
    	if (sum < 0)
    	{
    		printf("No answer\n");
    	}
    	else
    	{
    		printf("%d\n", sum);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    56.倒三角形

    在这里插入图片描述

    #include 
    int main()
    {
    	int n;
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 1; j <= i - 1; j++)
    			printf(" ");
    		for (int k = 1; k <= n - i + 1; k++)
    			printf("# ");
    		printf("\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    57.求子序列的和

    在这里插入图片描述

    #include
    int main()
    {
    	int n,m,i,k=0;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		double sum=0;
    		if(n==0&&m==0)
    		{
    			break;
    		}
    		for(i=n;i<=m;i++)
    		{
    			sum=sum+(1.0/i)/i;//换成i*i会有运算结果溢出//
    		}
    		k++;
    		printf("Case %d: %.5lf\n",k,sum);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    58.分数化小数

    在这里插入图片描述

    #include 
    int main()
    {
    	int a,b,c,s=0;
    	double m; 
    	while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    	{
    		if(a==0&&b==0&&c==0)
    		{
    			break;
    		}
    		m=1.0*a/b;
    		s++;
    		printf("Case %d: %.*f",s,c,m); 
    	}
    	return 0;
    } 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    printf(“% * . * lf\n”, a, b, c); 会输出a个字宽保留b位小数的浮点数运算结果c。

    该解法会出现精度问题,所有使用下面的数学解法。

    #include 
    
    int main()
    {
        int a, b, c, ct = 1;
        while(3 == scanf("%d%d%d", &a, &b, &c))
        {
            if(0 == a && 0 == b && 0 == c) break;
            int integer = a / b;                        // 获得整数部分
            printf("Case %d: %d.", ct++, integer);
            a %= b;         // 获得余数
            int i = 1;
            // 进行c-1次模数学拟除法求出小数点后c-1位,因为要四舍五入,所以最后一位单独处理
            while(i++ < c)
            {
                a *= 10;
                printf("%d", a / b);
                a %= b;
            }
            a *= 10;
            // 判断最后一位的下一位是否大于5,进行四舍五入
            printf("%d\n", ((a % b) * 10 / b > 5) ? (a / b + 1) : (a / b));
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    59.开灯问题

    在这里插入图片描述

    #include
    #include
    #define maxn 1010
    int a[maxn];
    int main()
    {
    	int n, k, first = 1;
    	memset(a, 0, sizeof(a));
    	scanf("%d%d", &n, &k);
    	for (int i = 1; i <= k; i++)
    		for (int j = 1; j <= n; j++)
    			if (j % i == 0) a[j] = !a[j];
    	for (int i = 1; i <= n; i++)
    		if (a[i]) 
    		{ 
    			if (first) 
    				first = 0; 
    			else 
    				printf(" "); 
    			printf("%d", i); 
    		}
    	printf("\n");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    “memset(a,0,sizeof(a))”的作用是把数组a清零,它也在string.h中定义。虽然也能
    用for循环完成相同的任务,但是用memset又方便又快捷。另一个技巧在输出:为了避免输出
    多余空格,设置了一个标志变量first,可以表示当前要输出的变量是否为第一个。第一个变 量前不应有空格,但其他变量都有。

    60.蛇形填数

    在这里插入图片描述
    解法一:

    #include
    #include
    #define maxn 20
    int a[maxn][maxn];
    int main()
    {
    int n, x, y, tot = 0;
    scanf("%d", &n);
    memset(a, 0, sizeof(a));
    tot = a[x=0][y=n-1] = 1;
    while(tot < n*n)
    {
    while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;
    while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;
    while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
    while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
    }
    for(x = 0; x < n; x++)
    {
    for(y = 0; y < n; y++) printf("%3d", a[x][y]);
    printf("\n");
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    解法二:

    #include
    int a[100][100],book[100][100];
    int main()
    {
        int n,i,j,step=2,x=0,y=0,tx,ty;
        int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//右,下,左,上。若想要输出逆时针蛇行填数,只需要改变几个坐标顺序就好了
        scanf("%d",&n);
        a[0][0]=1;//把第一个数保存下来
        book[0][0]=1;//把第一个数标记,防止重复使用
        for(i=0;i<4;)
        {
              tx=x+next[i][0];//从第二个点开始
              ty=y+next[i][1];
              if(ty>n-1||tx>n-1||book[tx][ty]==1||ty<0)/*先让这个人一直沿右走,直到它的众坐标,或者横坐标大于这个矩阵的边界值,或者小于边界值,再或者这个点已经走过了,此时要改变方向*/
              {
                  i++;//改变方向
                  if(i==4)//需要判断是否已经走过一圈了,如果走到一圈后,i要赋值为零再从新按顺时针走一圈
                  {
                        if(step>n*n)//走完一圈判断步数是否大于n*n
                        break;
                        else
                        i=0;//从新按顺时针方向走
                    }
                    tx=x+next[i][0];//计算改变方向后的第一个数,并标记这个点已经走过
                    ty=y+next[i][1];
                    a[tx][ty]=step;
                    book[tx][ty]=1;
                    step++;
                }    
                if(a[tx][ty]==0&&book[tx][ty]==0)//如果这个数是零,并且这个点没有走过,就留下对应的数
                {
                    a[tx][ty]=step;
                    book[tx][ty]=1;
                    step++;
                }
                x=tx;y=ty;
                if(step>n*n)
                    break;
            }
    
        //输出结果
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                printf("%3d ",a[i][j]);
            printf("\n");
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    如何对GPU的使用情况进行监控
    使用自功率谱、互功率谱估计滤波器幅频特性
    AI Agent涌向移动终端,手机智能体开启跨端跨应用业务连接新场景
    Adobe XD文件转PDF、再转成一张大图的办法
    _sys_exit()函数的以及semihosting半主机模式的说明
    【网络协议】Http-下
    记一次ThreadLocal引发的线上故障
    Kafka消息存储
    微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系
    <Redis开发与运维>一书阅读笔记记录
  • 原文地址:https://blog.csdn.net/weixin_61084441/article/details/127557707