int main()
{int ci
scanf("%d", &ci)
int k = 1, i = 0
B:
if (ci > i)
{k *= 10
i++
goto B
}
printf("%d\n",k)
return 0
}
34+2*2TAN30度=36.309O0001T0303G98M08M03S800G97GOX36.309Z2这里就是起刀点G1Z0F200X34W-2GOU-2Z80X70M05M30给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例 1:
用最常规的方法,直接用除余来判断
进阶:
你能不使用循环或者递归来完成本题吗?
利用3进制来判断
执行用时:108 ms, 在所有 Go 提交中击败了8.55%的用户
内存消耗:6.9 MB, 在所有 Go 提交中击败了11.48%的用户
能看到其实上面的效率会有点慢,我们可以优化一下
执行用时:28 ms, 在所有 Go 提交中击败了75.09%的用户
内存消耗:6 MB, 在所有 Go 提交中击败了100.00%的用户
还有一种适用于该题的数学解法,在int范围内的3的幂只有19个,分别是
最大的第19个为1162261467
因为 3 是质数,所以 3^19 的除数只有 3 3,3 1, …3 ^19,因此我们只需要将 3^19 除以 n。若余数为 0 意味着 n 是 3^19的除数,因此是 3 的幂。
执行用时:24 ms, 在所有 Go 提交中击败了84.39%的用户
内存消耗:6.1 MB, 在所有 Go 提交中击败了29.51%的用户