幂次方的分析计算

需求:给你一个整数 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;//声明变量n变量f为整数int类型
printf("请输入n的值");
scanf("%d",&n);//从键盘输入扫描值并赋值给n
printf("请输入f的值");
scanf("%d",&f);//从键盘输入扫描值并赋值给f
}

接着这个程序需要我们判断是与否。(在复杂的程序中很难加入判断建议提前写好)

1
2
3
4
5
6
7
8
9
10
11
int l;//声明变量l为整数int类型
//添加注释:l变量为是与否的判断值,其表达的含义如下
//1---中间值(用于是非判断外的选择语句)
//2---否(false)
//3---是(true)
if(l==3){
printf("True");//判断l变量的值,只有为3时输出True
}else{
printf("False");//判断l变量的值,当l为3以外的值时输出False
}
return 0;//返回结果0

在这个需求当中我们需要先解决几个数学上的问题,1是所有数的幂次方,0不是任何数的幂次方。我数学也不好有关这方面的问题请询问数学老师。

综上,要完成这个需求我们就需要先把0和1这两种情况单独考虑。比如先用if…else if…函数先把这两种情况筛选出来。

1
2
3
4
5
6
if(n==0){
l=2;//当n的值为0时,赋值l为2输出否(False)
}
else if(n==1){
l=3;//当n的值为1时,赋值l为3输出是(True)
}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;//l的中间值1代表n除以f的余数为零,为后续判断提供选择依据
while(l==1){//当l的值为1时进入while循环(该循环的用途为n循环除以f)
if(n==1){
l=3;//n循环除以f的值后最后结果为1
}else if(n%f==0){
n/=f; //循环相除
l=1;
}else{
l=2;//循环相除后结果不为1输出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;
}

这样就可以完美实现该需求。