双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

判断是否3的幂 解决方法

可西哥 可西哥 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在CSDN上看到一个关于判断一个数是否3的幂的问题,要求是使用简洁的算法,

于是结合被3整除的数的特点,以及大数的运算,得到了以下的程序,思路比较简单

主要解决以下几个问题:

一是判断一个字串是否有效的数字,这个比较简单就不细说了;

二是判断一个数是否能被3整除;这个只要将各位数上的数相加,得到各位数之和,

再判断各位数之和是否3的倍数;一个10万位的数,各位数之和也不过90万,使用一个

unsigned int足够了;

三是如何将一个大数除以3;直接将每一位除3,再考虑上一位的余数即可;

以下是C++源程序:



// Judge3.cpp : Defines the entry point for the console application.
/*
判断一个数是否3的幂,考虑大数的情况
算法要求简洁

思路:
将大数表示成数组,进行判断
*/

#include "stdafx.h"
#include "stdio.h"

/*
函数 判断一个字串是否数字,并返回位数
*/
bool isnumeric(char* big, unsigned int *intLen)
{
unsigned int i = 0; //临时变量
unsigned int intPos=0; //某一位的值

*intLen = 0;
for (i=0;big[i]!=0;i++,(*intLen)++)
{
intPos = (int)big[i]-'0';
if (intPos<0||intPos>9)
{
return 0;
}
}
return 1;
}

/*
函数 判断一个大数是否能被3整除
使用各位相加的方法进行判断
同时过滤比3小的数
*/
bool CanDiv3(char* big)
{
unsigned int i = 0; //临时变量
unsigned int intLen=0; //位数
unsigned int intPos=0; //某一位的值
unsigned int intSum = 0; //各位和

//计算位数
//intLen=sizeof(big);
//计算各位和
for (i=0;big[i]!=0;i++,intLen++)
{
intPos = (int)big[i]-'0';
intSum +=intPos;
}
//过滤比3小的数
if (intLen<=1 && intSum <3)
{
return 0;
}

if (intSum % 3==0)
{
return 1;
}
else
{
return 0;
}
}


/*
函数 大数除3
函数返回是否处理成功;
如果不能被3整除,不做处理

*/
bool Div3(char* big)
{
unsigned int i = 0; //临时变量,正在处理左第几位
unsigned int intLen=0; //结果的位数
unsigned int intPos=0; //某一位的值
unsigned int intDiv=0; //除3后的结果
unsigned int intMod = 0; //余数
bool blnCan = false; //是否能被3整除

blnCan = CanDiv3(big);
if (!blnCan)
{
return 0;
}

for (i=0;big[i]!=0;i++)
{
intPos = (int)big[i]-'0';
intDiv = (intMod*10+intPos)/3;
intMod = (intMod*10+intPos) % 3;
if (!(intLen==0&&intDiv==0))
{
big[intLen]=intDiv+'0';
//big[i]=intDiv+'0';
intLen++;
}
}
big[intLen]=0;
return 1;
}

/*
函数 判断是否3的幂
函数返回3的几次幂
如果不是3的幂,则返回0
*/

int Power3(char* big)
{
unsigned int intRet=0; //返回值
unsigned int intLen=0; //长度
unsigned intP=0; //幂
bool blnL = false; //判断返回值

blnL = isnumeric(big,&intLen);
if (!blnL){return -1;}
while (Div3(big))
{
intRet++;
//判断
blnL=isnumeric(big,&intLen);
if (intLen==1&&big[0]=='1')
{
return intRet;
break;
}
}
return 0;
}

//主程序
int main(int argc, char* argv[])
{
char strInput[1024];

char* chrTest="3243243231";
bool tt=false;
unsigned int intLen=0;
int intP=0;
bool lo=true;

while (lo)
{
printf("\n请输入整数(0退出):\n");
scanf("%s",&strInput);

chrTest = strInput;
tt=isnumeric(chrTest,&intLen);
if (intLen==1&&chrTest[0]=='0')
{
break;
}

//printf("\n您输入的是 %s\n",strInput);
if (tt)
{
printf("它共有%d位\n",intLen);
tt=CanDiv3(chrTest);
if (tt)
{
printf("它能被3整除\n");
/*
tt=Div3(chrTest);
if (tt)
{
printf("除3结果为%s\n\n",chrTest);
}
*/
intP = Power3(chrTest);
if (intP>0)
{
printf("它是3的%d次幂\n",intP);
}
else
{
printf("它不是3的幂\n");
}

}
else
printf("它不能被3整除\n");
}
else
{
printf("您输入的不是有效的数字!\n");
}
}

return 0;
}

运行结果如下:



请输入整数(0退出):
adf1130
您输入的不是有效的数字!

请输入整数(0退出):
123.21
您输入的不是有效的数字!

请输入整数(0退出):
1
它共有1位
它不能被3整除

请输入整数(0退出):
81
它共有2位
它能被3整除
它是3的4次幂

请输入整数(0退出):
84
它共有2位
它能被3整除
它不是3的幂

请输入整数(0退出):
3433683820292512484657849089281
它共有31位
它能被3整除
它是3的64次幂

请输入整数(0退出):
5164687961316549165468645642
它共有28位
它能被3整除
它不是3的幂

请输入整数(0退出):
0
Press any key to continue

以上结果在Visual C++ 6下运行通过

稍加修改也可以判断其它数的幂,但只限于一位数,如果是二位数,在除法上需要加以改进。

2007年2月10日 xmxoxo 于厦门
...全文

相关推荐

判断一个整数是否是2的N次幂实现方法

下面小编就为大家分享一篇判断一个整数是否是2的N次幂实现方法,实例简洁,具有很好的参考价值。希望对大家有所帮助

weixin_38547409

Vue2 实现色卡选择器:轻松点击复制颜色代码」 「一步到位!用 Vue2 实现高效的色卡选择和复制功能」 「前端色彩展示:Vue2 色卡选择页面从入门到实战」 「Vue2 实战:实现一个多选项卡的颜

Vue2 实现色卡选择器:轻松点击复制颜色代码」 「一步到位!用 Vue2 实现高效的色卡选择和复制功能」 「前端色彩展示:Vue2 色卡选择页面从入门到实战」 「Vue2 实战:实现一个多选项卡的颜色选择和复制页面」Vue2 实现色卡选择器:轻松点击复制颜色代码」 「一步到位!用 Vue2 实现高效的色卡选择和复制功能」 「前端色彩展示:Vue2 色卡选择页面从入门到实战」 「Vue2 实战:实现一个多选项卡的颜色选择和复制页面」Vue2 实现色卡选择器:轻松点击复制颜色代码」 「一步到位!用 Vue2

南北极之间

C# 位运算 判断是否为2的N次幂

从键盘输入一个数判断该数字是否是2的N次幂 用位运算的方法实现

linker9110

一条语句判断整数a是否是2的整数幂

仅用一条c语句,完成判断一个整数是否是2的整数幂的工作。

jiangruoran

Leetcode 326:3的幂

判断是否是3的幂次方 问题描述: 给定一个整数,写一个函数来判断它是否是 3 的幂次方。 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输入: 45 输出: false 解题思路:   找出数字 n 是否是数字 b 的幂的一个简单方法是,n%b只要余数为 0,就一直将 n 除以 b。如果n是b的幂,那么最终结果肯定是1. eg.(1)1%3 = =1(true);      (2)3%3= =0         3/3== 1(true)      (3)45%3= =0   15%3=

weixin_38696196
评论 2
收藏 已收藏
分享
返回顶部
可西哥
图形处理/算法 19,463 成员 50,678 内容