/*
一小球从100米高空自由落下,
每次落地后反弹为原高度的一半
第十次落地是,共经过多少米
第十次反弹多高
*/
void test_37()
{
double hight = 100;
double lenth = 100;
for (int i = 1; i <= 10; ++i)
{
hight = hight / 2;//每次反弹为原高度的一半
lenth += hight * 2;
}
printf("第十次落地共经过%f米,\n第十次反弹%f米\n", lenth, hight);
}
/*
在100~999中查找符合如下条件的整数并输出:
这个数是完全平方数,并且又有两位数字相同
*/
void num_trans_char(int num,char *ch)
{
for (int i = 0; num != 0; ++i)
{
ch[i] = num % 10;
num = num / 10;
}
}
void test_41()
{
//10^2 ~ 31^2
char ch[3] = { 0 };//因为100~999都是三位数
int num = 0;
for (int i = 10; i < 32; ++i)
{
num = i*i;
num_trans_char(num, ch);
if (ch[0] == ch[1] || ch[0] == ch[2] || ch[1] == ch[2])//如果有两个数字相等
printf("%d\n", num);
}
}
/*
有这样一个六位数,它本身是一个整数的平方
其高三位和第三位也是一个整数的平方
例如225625=475^2,求满足上述条件的所有六位数
*/
void num_trans_char(int num, int *ch)
{
int j = 5;
for (int i = 0; num != 0; ++i,--j)
{
ch[j] = num % 10;
num = num / 10;
}
}
int ch_trans_num(int ch[])
{
int num = 0;
int len = sizeof(ch)/sizeof(ch[0]);
for (int i = len - 1,j=0; i >= 0; --i,++j)
{
num += ch[i] * pow((double)10, j);
}
return num;
}
void test_42()
{//317^2 ~ 1000^2
// 10^2 ~ 32~2
int ch[6] = { 0 };
int low = (int)sqrt((double)100000);
int high = (int)sqrt((double)999999);
int num = 0;
int tmp1[3] = { 0 }, tmp2[3] = { 0 };
for (++low; low < high; ++low)
{
bool flag = true;
double num1 = 0, num2 = 0;
num = (int)pow((double)low, 2);//得到一个六位数
num_trans_char(num, ch);//转换成数组
int j = 0;
for (int i = 0; i < 3; ++i,++j)
{
tmp1[i] = ch[j];
}//得到前三位的数组
{
for (int i = 2, j = 0; i >= 0; --i, ++j)
{
num1 += tmp1[i] * pow((double)10, j);
}
}//转换成数字
num1 = sqrt((double)num1);
for (int i = 1; i < 32; ++i)//判断其是否能够完全开平方
{
if (num1 != i)
flag = false;
else
{
flag = true;
break;
}
}
if (flag == false)
continue;
for (int i = 0; i < 3; ++i, ++j)
{
tmp2[i] = ch[j];
}//得到后三位的数组
{
for (int i = 2, j = 0; i >= 0; --i, ++j)
{
num2 += tmp2[i] * pow((double)10, j);
}
}//转换成数字
num2 = sqrt((double)num2);
for (int i = 1; i < 32; ++i)//判断其是否能够完全开平方
{
if (num2 != i)
flag = false;
else
{
flag = true;
break;
}
}
if (flag)
{
printf("%d\n", num);
}
}
}
有更简单的方法
void test_true_42()
{
long i, n, n1, n2, n3, n4;
for (i = 100000; i <= 999999; ++i)
{
n = (long)sqrt((double)i);
if (i == n*n)//六位数是一个完全平方数
{
n1 = i / 1000;//高三位
n2 = i % 1000;//低三位
n3 = (long)sqrt((double)n1);
n4 = (long)sqrt((double)n2);
if (n1 == n3*n3&&n2 == n4*n4)
{
printf("%d\n", i);
}
}
}
}
/*
求等差数列
幼儿园老师给学生发糖果 又前往后的糖果数量成等差数列
前四个学生的糖果数目之和是26 之积是880
前前二十个等差数列
*/
void test_43()
{
int candy[20] = { 0 };
int first = 0, count = 0;
int n1, n2, n3, n4;
for (int i = 0; i < 26; ++i)//暴力遍历
{
for (int j = 1; j < 20; ++j)
{
n1 = i;
n2 = n1 + j;
n3 = n2 + j;
n4 = n3 + j;
if (((n1 + n2 + n3 + n4) == 26) && (n1*n2*n3*n4) == 880)
{
first = i;
count = j;
}
}
}
for (int i = 0; i < 20; ++i)
{
printf("%d\t", first + (count*i));
}
}
/*
自守数指的是一个数的平方的尾数等于该数自身
比如25^2=625
求10000以内的所有自守数
*/
void num_trans_ch(int num, int *ch)
{
for (int i = 0; num != 0; ++i)
{
ch[i] = num % 10;
num = num / 10;
}
}
void test_45()
{
int ch[10] = { 0 };
for (int x = 0; x < 1000; ++x)
{
int num = x*x;
num_trans_ch(num, ch);
int wei=0;
if (x / 100 != 0)//3位数
{
for (int i = 0; i < 3; ++i)//取尾数
{
wei += ch[i] * pow((double)10, i);
}
}
else if (x / 10 != 0)//2
{
for (int i = 0; i < 2; ++i)
{
wei += ch[i] * pow((double)10, i);
}
}
else if (x / 1 != 0)//1
{
for (int i = 0; i < 1; ++i)
{
wei += ch[i] * pow((double)10, i);
}
}
if (wei == x)
printf("%d*%d=%d\n", x, x, num);
}
}