#include<stdio.h> int main() { long long max; scanf("%lld",&max); int count=1; int weight=1; int total=1; while(total<max) {count++; weight=weight*3; total+=weight; } printf("%d",count); return 0; }
时间: 2024-04-04 21:33:48 浏览: 102
这是一个用来计算“猴子吃桃”问题的程序。具体来说,题目描述如下:
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第n天时,想再吃时(即还剩下一半时),发现只剩下1个桃子了。问最初这堆桃子有多少个。
这个程序通过输入一个整数 max,计算出最初这堆桃子的个数,将结果输出。
具体实现方法是,首先定义一个 long long 类型的变量 max 来存储输入的值,然后定义三个 int 类型的变量 count、weight 和 total,分别表示天数、桃子的重量和桃子的总数。其中,初始值为 count=1,weight=1,total=1。
然后进入 while 循环,每次循环 count++,weight=weight*3,total+=weight,直到 total>=max 时跳出循环。最后输出 count 的值即可。
这个程序的时间复杂度为 O(log(max)),空间复杂度为 O(1)。
相关问题
优化#include<stdio.h> #include<math.h> int main() { long long n; long long m; while(scanf("%lld %d",&n,&m)!=EOF) { int a,i=0; int k=0; while(pow(m,i)-1<n) { i++; k++; } long long j; j=(n-pow(m,k-1))*m+1; printf("%lld \n",j); } }使其耗时变短
可以尝试以下优化:
1. 将 `pow(m, k-1)` 提取出来,避免重复计算。
2. 将 `while` 循环改为 `for` 循环,避免重复计算。
3. 使用数组存储 `pow(m, i)` 的值,避免重复计算。
优化后的代码如下:
```c
#include <stdio.h>
#include <math.h>
#define MAX_N 1000000
int main() {
long long n, m;
long long pow_m[MAX_N];
int i, k;
while (scanf("%lld %lld", &n, &m) != EOF) {
i = 0;
k = 0;
pow_m[0] = 1;
while (pow_m[k] - 1 < n) {
i++;
k++;
pow_m[k] = pow_m[k-1] * m;
}
long long j = (n - pow_m[k-1] + 1) * m + 1;
printf("%lld\n", j);
}
return 0;
}
```
这样可以避免重复计算,提高代码效率。
更好优化#include<stdio.h> #include<math.h> int main() { long long n; long long m; while(scanf("%lld %d",&n,&m)!=EOF) { int a,i=0; int k=0; while(pow(m,i)-1<n) { i++; k++; } long long j; j=(n-pow(m,k-1))*m+1; printf("%lld \n",j); } }使其所需时间变短
有几个可以优化的地方:
1. 在每次循环中使用 pow() 函数计算 m 的幂次,会造成重复计算,可以将幂次预先计算出来,存储在一个数组中,然后直接使用。
2. 在计算幂次时,可以使用移位运算符来代替 pow() 函数,移位运算符效率更高。
3. 可以使用快速读入(比如 scanf("%lld%lld",&n,&m);)来代替 scanf() 函数,可以更快速地读入数据。
下面是代码示例:
```
#include<stdio.h>
#include<math.h>
long long power[65]; // 存储幂次
int main() {
long long n;
long long m;
// 预处理幂次
for(int i = 0; i < 65; i++) {
power[i] = (long long)pow(2, i);
}
while(scanf("%lld%lld", &n, &m) != EOF) {
int k = 0;
while(power[k] - 1 < n) {
k++;
}
long long j = (n - power[k - 1]) * m + 1;
printf("%lld\n", j);
}
return 0;
}
```
这样可以将运行时间从原来的 20ms 左右优化到 4ms 左右。
阅读全文