C语言经典编程282例07

036 小球下落问题

一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第十次反弹多高?

小球从100米高处自由下落,第一次落地时经过100米,这个需单独考虑,从第一次弹起到第二次落地前经过的路程为前一次的高度的一半×2,加上前面弹起的路程——因为每次都有弹起和下落两个过程。
在这里插入图片描述

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
    float meter = 100, high = 100;
    int i;
    
    for(i = 0; i < 9; i++)
    {
    	high = high / 2;
        meter += high * 2;				//累积高度和加上下一次落下后弹起与下落的高度。
	}
    
	printf("第十次落地后弹起的高度是:%1f\n", high / 2);
	printf("总长度:%1f\n", meter);
    printf("\n");
 } 

037 巧分苹果

一家农户,一天父亲推出一车苹果,共2520个,准备分给他的6个孩子,父亲按照先写在一张纸上的数字进行把苹果分好,每个人拿到的苹果不同,他说:“老大把你分到的苹果1 / 8 给老二,老二拿到后,连同原来的苹果分1 / 7,给老三,老三拿到后,连同原来的苹果分1 / 6给老四,依此类推,最后老六拿到后,连同原来苹果分1 / 3 给老大,这样你们苹果就一样多了。原来他们各自拿多少?
在这里插入图片描述

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>



  main()
{
    int x[7], y[7], s, i;
    s = 2520 / 6;						//平均每个人平分多少个苹果
    
    for(i = 2; i <= 6; i++)				//求还未分给弟弟的苹果量
    {
    	y[i] = s * (9 - i) / (8 - i);
	}
	
	y[1] = x[1] = (s - y[6] * 1 / 3) * 8 / 7;  //老大减去弟弟给的苹果以及未分给弟弟的苹果。
    
    for(i = 2; i <= 6; i++)						//根据减去哥哥给的苹果
    {
    	x[i] = y[i] - y[i -1] * 1 / (10 -i);
	}
	
	for(i = 1; i <= 6; i++)
	{
		printf("x[%d] = %d\n", i, x[i]);
	}
	
	printf("\n");
 }
  

038 老师分糖果

老师将糖果分成若干份,让学生按任意次序领取,第一个领取的,得一份加上剩余糖果得1/10;第二个领取,得到2份加上剩余糖果得1/10;
第三个领取得,得到3份加上剩余糖果的1/10,… 依次类推。问共有多少个学生?老师共将糖果分成了几等份?
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
  main()
{
   int n;
   float sum1, sum2;
    for(n = 11 ; ; n++)
    {
    	sum1 = (n + 9) / 10.0;
    	sum2 = (9 * n + 171) / 100.0;
    	
    	if(sum1 != (int)sum1)
    	{
    		continue;
		}
		
		if(sum2 != (int)sum2)
    	{
    		continue;
		}
		
		if(sum1 == sum2)
		{
			break;
		 } 
	}
	
   	printf("共有 %d 个学生\n 将糖果分成 %d份", (int)(n / sum1), n);
	printf("\n");
 }
  

039 IP地址形式输出

任意输入32位的二进制数,编程实现将该二进制数转换成IP地址形式:
如:
输入: 11111111 11111111 11111111 11111111 11111111
输出: 255.255.255.255

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

int bin_dec(int x, int n)
{
	if(n == 0)
	{
		return 1;
	}
	
	return x * bin_dec(x, n-1);
}

  main()
{
   int i, j, ip[4]= {0};
   char a[33];
   scanf("%s", a);
    
   for(i = 0; i < 8; i++)
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[0] += bin_dec(2, 7 - i); 
	   }
   }
   
    for(i = 8; i < 16; i++ )
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[1] += bin_dec(2, 15 - i); 
	   }
   }
   
    for(i = 16; i < 24; i++)
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[2] += bin_dec(2, 23 - i); 
	   }
   }
   
    for(i = 24; i < 32; i++)
   {
   	 if(a[i] == '1')
   	  {
   	  	ip[3] += bin_dec(2, 31 - i); 
	   }
	   
	 if(a[i] == '\0')
	 {
	 	break;
	 }
   }
   
   printf("%d . %d . %d . %d", ip[0], ip[1], ip[2], ip[3]);

	printf("\n");
 }
  

//调用函数不同

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

int bin_dec(int x, int n)
{
	if(n == 0)
	{
		return 1;
	}
	return pow(2, n);	
}

  main()
{
   int i, ip[4] = {0};
   char a[33];
  
    scanf("%s", a);
   
   for(i = 0; i < 8; i++)
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[0] += bin_dec(2, 7 - i); 
	   }
   	 
   }
   
    for(i = 8; i < 16; i++ )
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[1] += bin_dec(2, 15 - i); 
	   }
   }
   
    for(i = 16; i < 24; i++)
   {
   	  if(a[i] == '1')
   	  {
   	  	ip[2] += bin_dec(2, 23 - i); 
	   }
   }
   
    for(i = 24; i < 32; i++)
   {
   	 if(a[i] == '1')
   	  {
   	  	ip[3] += bin_dec(2, 31 - i); 
	   }
	   
	 if(a[i] == '\0')
	 {
	 	break;
	 } 
   }
   
   printf("%d . %d . %d . %d", ip[0], ip[1], ip[2], ip[3]);
	printf("\n");
 }

040 特殊的完全平方数

在3位整数100 ~ 999 中查找符合如下条件的整数并在屏幕上:这个数既是完全平方数,又有2个数字相同,如121(11的平方)、144(12的平分)。
在这里插入图片描述

//   ____________  Me ______________
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
  main()
{
   int i, j;
   int hun, ten, data;
   
   for(i = 100; i <= 999; i++ )
   {
   	 
   	 j = 10;
   	 while( j * j <= i)
   	 {
   	 	if(i == j * j)
   	 	{
   	 		hun = i / 100;
   	 		data = i - hun *100;
   	 		ten = data / 10;
   	 		data = data - ten * 10;
   	 		
   	 		if(hun == ten || hun == data || ten == data)
   	 		{
				printf("% 5d\n", i);
			}
		}
   	    j++;	
	 }
   }
	printf("\n");
 }
  
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
   int i, j,x1, x2, x3;
   float s;
   
   for(i = 100; i <= 999; i++ )
   {
   //方法一:要添加变量j,麻烦
   	 j = i;
   	 x1 = j % 10;
   	 j = j / 10;
   	 x2 = j % 10;
   	 j = j / 10;
   	 x3 = j % 10;
   	 
   	 //方法二
   	 /*x1 = i / 100;
   	 x3 = i - x1 *100;
   	 x2 = x3 / 10;
   	 x3 = x3 - x2 * 10;*/
   	
   	 if(x1 == x2 || x2 == x3 || x1 == x3)
   	 {
   	 	s = sqrt(i);
   	 	
   	 	if(s == (int)s) 				//判断是否是整数
   	 	{
   	 		printf("%d \n", i);
		}
		else
		{
			continue;
		}
	 }
   }
   
	printf("\n");
 }
  

041 一数三平方

有这样一个6位数,它本身是一个整数的平分,其高三位和低三位也分别是一个整数的平分,如 225625 = 475的平分,求满足上诉条件的所有6位数。

sqrt函数的返回值是一个double,若将开平分后得到的小数其小数点后的部分为0,则将其强制转换为其他整型也不会产生数据的流失。

//  ——————————————————————  官方    ———————————————————————————
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
   long i, n, n1, n2, n3, n4, count = 0;
   printf("这样的数有:\n");
   
   for(i= 100000; i<= 999999; i++ )
   {
   	    
   	    n = (long) sqrt(i);
		
		if(i == n * n)
		{
			n1 = i / 1000;
			n2 = i % 1000;
			n3 = (long) sqrt(n1);
			n4 = (long) sqrt(n2);
			
			if(n1 == n3 *n3 && n2 == n4 * n4)
			{
			    count++; 
			    printf("%5d\n", i);
			}
		}
   }
	
	printf("\n满足条件有%d个\n", count);
	printf("\n");
 }
// ——————————————————————————  ME   ————————————————————
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
   int i, j, num;
   int hun, ten, data;
   float s_l, s_h, s;
   
   for(num= 100000; num<= 999999; num++ )
   {
   	  //求出低3位 
   	    i = num % 1000;
   	 	s_l = sqrt(i);
   	 	
   	 //求出高3位
   	 	i = num / 1000;
		s_h = sqrt(i);
		
     //求出该值的平均值
		s = sqrt(num);
		
	//判断高3位,低3位,全值的平方根是不是整数
		if(s == (int)s && s_l == (int)s_l && s_h == (int)s_h)	
		{
			j++;		//计算个数
			printf("%5d\n", num);
		}
   }
	
	printf("一共%d个\n", j);
	printf("\n");
 }

042 求等差数列

老师给学生由前向后发糖果,每个学生得到的糖果数目成等差数列,前4个学生得到的糖果数目之和是26,积是880,编程前29名学生每个人得到的糖果数目。
在这里插入图片描述
在这里插入图片描述

—————————————————————————————— 官方——————————————————
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
   int j, n, number;
 
   for(number = 1; number < 6; number++)
   {
   	 for(n = 1; n < 4; n++)
   	 {
   	 	if((4 * number + 6 * n == 26) && ((number * (number + n) * (number + 2 * n) * (number + 3 * n)) == 880))
   	 	{
   	 		printf("%d %d\n", number, n);
   	 		
   	 		 for(j = 1; j <= 20; j++)
   			{
   				printf("数目:%3d\n",number);
   	 			number += n;
   	 			
   	 			if(j % 5 == 0)
   	 			{
   	 				printf("\n");
				}
   			}
		}
	 }
   }
   
   
	printf("\n");
 }
 
———————————————— ME————————————————————————
//多了一个变量。
include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
   int i, a, d, num;
 
   for(a = 1; a < 6; a++)
   {
   	 for(d = 1; d < 4; d++)
   	 {
   	 	if((4 * a + 6 * d == 26) && ((a * (a + d) * (a + 2 * d) * (a + 3 * d)) == 880))
   	 	{
   	 		printf("%d %d\n", a, d);
   	 		
   	 		 for(i = 0; i <= 20; i++)
   			{
   	 			num = a + i * d;
   	 			printf("数目:%d\n",num);
   			}
			break;
		}
	 }
   }
   
	printf("\n");
 }
 

043 亲密数

如果整数A的全部因子(不包括A)之和等于B,且整数B的全部因子(不包括B)之和等于A ,则将A 称为亲密数,如220的全部因子(不包括220)之和:1 + 2 + 4 + 5 + 10 +11 + 20 + 22 +44 +55 +110 =284,284 的全部因子(不包括284)之和: 1+ 2+ 4+ 71 +142 = 220;故220 + 284 为亲密数,求10000 以内的所有亲密数。
在这里插入图片描述

  • 先逐个求因子

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>


  main()
{
   int j, i, k, a_n, b_n;
 
   for(i = 1; i <= 10000; i++)
   {
   //每次新值都需要先赋初始值
   	 a_n = 0;
   	 b_n = 0;
   	 
   	 for(j = 1; j < i; j++) 
   	 {
   	 	if(i % j == 0)			//求因子
   	 	{
		   a_n += j;
		}
		
	 }
	 
	 for(k = 1; k < a_n; k++)	//求因子
	 {
	 	if(a_n % k == 0)
   	 	{
		   b_n += k;
		}
	 } 
	 
	 if(b_n == i && i != a_n && i < a_n) //判断条件
	 {
	 	printf("a = %d  b = %d\n",a_n, b_n);
	 }
   }
	printf("\n");
 }

044 自守数

自守数是一个数的平方尾数等于该数的自然数,如 在这里插入图片描述
在这里插入图片描述
编程求一定范围(此处10000为例)内的所有自守数。

无法用:“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,——因为计算机无法表示过大的整数
在这里插入图片描述
在这里插入图片描述


#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>


  main()
{
   long i, j, k1, k2, k3, a[10] = {0}, num, m, n, sum;
   printf("请输入一个数表示范围:\n");
   scanf("%ld", &num);
   
   printf("结果是:");
   
   for(j = 0; j < num; j++)
   {
   	 m = j;
   	 n = 1;
   	 sum = 0;
   	 k1 = 10; 
   	 k2 = 1;
   	 
   	 while(m != 0)         //判断该数的位数
   	 {
   	    a[n] = j % k1;     //将分离出的数存在数组中
		n++;				//记录位数
		k1 *= 10;			//最小位数
		m = m / 10;  	
	 }
	 
	 k1 = k1 / 10;
	 k3 = k1;
	 
	 for(i = 1; i <= n - 1; i++)
	 {
	 	sum +=(a[i] / k2 * a[n - i] ) % k1 * k2; //求每一部分积之和
	 	k2 *= 10;
	 	k1 /= 10;
	 }
	 
	 sum = sum % k3;  					//求和的后n-1 位
	 
	 if(sum == j)
	 {
	 	printf("%5ld", sum);
	 }
	} 
   
	printf("\n");
 }
 

一些知识点回顾:
看常用数据类型https://blog.csdn.net/qq_41070511/article/details/110523111

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值