当前位置:首页 » 《随便一记》 » 正文

C语言百日刷题第六天

20 人参与  2022年11月07日 12:41  分类 : 《随便一记》  评论

点击全文阅读


C语言百日刷题第六天

51.鸡兔同笼问题52.输出所有形如aabb的完全平方数53.3n+1问题54.输出100~999的所有水仙花数55.韩信点兵56.倒三角形57.求子序列的和58.分数化小数59.开灯问题60.蛇形填数

51.鸡兔同笼问题

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

#include<stdio.h>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");elseprintf("%d %d", a, b);return 0;}

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

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

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

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

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

根据方法一写出的代码:

#include<stdio.h>#include<math.h>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;}

方法二:

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

根据方法二写出的代码:

#include<stdio.h>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;}

53.3n+1问题

在这里插入图片描述

#include<stdio.h>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;}

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

在这里插入图片描述

#include<stdio.h>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;}

55.韩信点兵

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

#include<stdio.h>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;}

56.倒三角形

在这里插入图片描述

#include <stdio.h>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;}

57.求子序列的和

在这里插入图片描述

#include<stdio.h>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;}

58.分数化小数

在这里插入图片描述

#include<stdio.h> 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;} 

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

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

#include <stdio.h>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;}

59.开灯问题

在这里插入图片描述

#include<stdio.h>#include<string.h>#define maxn 1010int 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;}

在这里插入图片描述

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

60.蛇形填数

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

#include<stdio.h>#include<string.h>#define maxn 20int 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;}

解法二:

#include<stdio.h>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;}

点击全文阅读


本文链接:http://zhangshiyu.com/post/47233.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1