C++编程 有一个八层灯塔,每层所点灯数是上一层的两倍,共有765盏灯,求灯塔塔底灯数

麻烦使用函数调用编写 我会写不过函数的调用写不出来。。。

供参考 答案为3

#include <stdio.h>
int calc(int i)
{
int j;
int sum = 0;
for(j = 0; j < 8; j ++)
sum+=i, i*=2;
return sum;
}
int main()
{
int i =1;
int r;
while(1)
{
r = calc(i);
if(r >= 765) break;
i ++;
}
if(r == 765) printf("result = %d\n", i);
else printf("no such result\n");
return 0;
}

 

这样效率更高一些

#include <stdio.h>
int calc(int i)
{
int j;
int sum = 0;
for(j = 0; j < 8; j ++)
sum+=i, i*=2;
return sum;
}
int main()
{
int r;
r = calc(1);

if(765%r) printf("no such result\n");
else printf("result = %d\n", 765/r);
return 0;
}追问

答案是384把。。。
求灯塔塔底灯数
!

追答

抱歉 没注意是塔底

以为是塔顶呢


修改后

第一种方式 暴力破解

#include <stdio.h>
int calc(int i)
{
    int j;
    int sum = 0;
    for(j = 0; j < 8; j ++)
        sum+=i, i*=2;
    return sum;
}
int main()
{
    int i =1;
    int r;
    while(1)
    {
        r = calc(i);
        if(r >= 765) break;
        i ++;
    }
    if(r == 765) printf("result = %d\n", i<<7);
    else printf("no such result\n");
    return 0;
}


第二种方式 公式计算

#include <stdio.h>
int calc(int i)
{
    int j;
    int sum = 0;
    for(j = 0; j < 8; j ++)
        sum+=i, i*=2;
    return sum;
}
int main()
{
    int r;
    r = calc(1);
 
    if(765%r) printf("no such result\n");
    else printf("result = %d\n", 765/r << 7);
    return 0;
}追问

嗯嗯 不错! 不过那个r = calc(1)啥意思

追答

每次都是倍数增加

都是8层

所以如果塔顶是n个的话,那么总数就是n+2*n+...+2^7*n

也就是n*(1+2+4+...+2^7)

所以计算出1的情况 再除一下 就可以了

所以呢 还有一个类似作弊的公式计算法

#include <stdio.h>
int calc(int i)
{
return (i<<8) -1;
}
int main()
{
    int r;
    r = calc(1);
 
    if(765%r) printf("no such result\n");
    else printf("result = %d\n", 765/r << 7);
    return 0;
}

代码就是这样一点点优化出来的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-20
#include<stdio.h>
#include <math.h>

int main()
{
int each=1,total=0;
for(each=1;each<765;each++){
for(int i=1;i<=8;i++){
total+=pow(2,i-1)*each;
}
if(total==765)
printf("底层灯为%d\n",each);
}
return 0;
}

//也供参考 我的答案是2。。。

第2个回答  2013-11-20
第一层x,第二层2x...第八层128x,共有灯(2^8-1)*x=765;
x=3;
int func(int layer,int total)
{
int powof2=1;

while(layer>0)

{

powof2*=2;

layer--;

}

return total/(powof2-1);

}
int main(){
cout<<func(8,765)<<endl;

}
第3个回答  2019-06-05
#include<stdio.h>
main()
{
int i,j,n,s;
for(i=1;i<765;i++)
{
n=i;
s=n;
for(j=1;j<8;j++)
{
n*=2;
s+=n;
}
if(s==765)
{
printf("first floor is %d\n",i);
break;
}
}
}