C语言百日刷题第六天

51.鸡兔同笼问题

``````#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)
else
printf("%d %d", a, b);
return 0;
}
``````

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

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

``````#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("%dn", 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("%dn",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)
{
}
else
{
printf("%dn", 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: %.5lfn",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(“% * . * lfn”, 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("%dn", ((a % b) * 10 / b > 5) ? (a / b + 1) : (a / b));
}
return 0;
}
``````

59.开灯问题

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

“memset（a，0，sizeof（a））”的作用是把数组a清零，它也在string.h中定义。虽然也能

60.蛇形填数

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

``````#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;
}

``````

THE END