幂次方的分析计算
需求:给你一个整数 n(-2^31 <= n <= 2^31 - 1),请你判断该整数是否是 f(2<=f<=9) 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == f^x ,则认为 n 是 f 的幂次方。
这个需求乍一看非常复杂,但是我们可以将需求模块化,分部分来完成需求。
我们先从简单的部分开始。(整数的输入)
根据需求,我们需要用户从键盘输入整数n和幂次方基数f。
1 2 3 4 5 6 7 8
| #include<stdio.h> int main(){ int n,f; printf("请输入n的值"); scanf("%d",&n); printf("请输入f的值"); scanf("%d",&f); }
|
接着这个程序需要我们判断是与否。(在复杂的程序中很难加入判断建议提前写好)
1 2 3 4 5 6 7 8 9 10 11
| int l;
if(l==3){ printf("True"); }else{ printf("False"); } return 0;
|
在这个需求当中我们需要先解决几个数学上的问题,1是所有数的幂次方,0不是任何数的幂次方。我数学也不好有关这方面的问题请询问数学老师。
综上,要完成这个需求我们就需要先把0和1这两种情况单独考虑。比如先用if…else if…函数先把这两种情况筛选出来。
1 2 3 4 5 6
| if(n==0){ l=2; } else if(n==1){ l=3; }else{...}
|
如果n是f的幂次方,一定满足n除以f的余数为0,在n循环除以f的值后最后结果为1
PS:有关上方数学计算内容如有不明确的地方请询问数学老师。
1 2 3 4 5 6 7 8 9 10 11 12
| if(n%f==0){ l=1; while(l==1){ if(n==1){ l=3; }else if(n%f==0){ n/=f; l=1; }else{ l=2; } }
|
下面我们来将上面的几部分代码组合起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<stdio.h> int main(){ int n,f,l; printf("请输入n的值"); scanf("%d",&n); printf("请输入f的值"); scanf("%d",&f); l=2; if(n==0){ l=2; } else if(n==1){ l=3; }else{ if(n%f==0){ l=1; while(l==1){ if(n==1){ l=3; }else if(n%f==0){ n/=f; l=1; }else{ l=2; } } } } if(l==3){ printf("True"); }else{ printf("False"); } return 0; }
|
这样就可以完美实现该需求。