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