作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/07/19 05:24:41
C++编程 有一个八层灯塔,每层所点灯数是上一层的两倍,共有765盏灯,求灯塔塔底灯数
麻烦使用函数调用编写 我会写不过函数的调用写不出来.
C++编程 有一个八层灯塔,每层所点灯数是上一层的两倍,共有765盏灯,求灯塔塔底灯数
供参考 答案为3#include <stdio.h>
int calc(int i)
{
\x09int j;
\x09int sum = 0;
\x09for(j = 0; j < 8; j ++)
\x09\x09sum+=i, i*=2;
\x09return sum;
}
int main()
{
\x09int i =1;
\x09int r;
\x09while(1)
\x09{
\x09\x09r = calc(i);
\x09\x09if(r >= 765) break;
\x09\x09i ++;
\x09}
\x09if(r == 765) printf("result = %d\n", i);
\x09else printf("no such result\n");
\x09return 0;
} 这样效率更高一些#include <stdio.h>
int calc(int i)
{
\x09int j;
\x09int sum = 0;
\x09for(j = 0; j < 8; j ++)
\x09\x09sum+=i, i*=2;
\x09return sum;
}
int main()
{
\x09int r;
\x09r = calc(1);

\x09if(765%r) printf("no such result\n");
\x09else printf("result = %d\n", 765/r);
\x09return 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;
}代码就是这样一点点优化出来的