社区
其它技术问题
帖子详情
如何高效求余数?
Googol
2005-02-04 02:15:34
面试题,只有+ - *和移位运算,如何计算一个数除3的余数?要求效率。
一次次减3的算法效率低。
好像和循环链表有关,哪位dx能帮忙想个算法?
...全文
394
10
打赏
收藏
如何高效求余数?
面试题,只有+ - *和移位运算,如何计算一个数除3的余数?要求效率。 一次次减3的算法效率低。 好像和循环链表有关,哪位dx能帮忙想个算法?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
goodluckyxl
2005-02-04
打赏
举报
回复
所有位数相加和
和 - 和/3
kobefly
2005-02-04
打赏
举报
回复
1.把这个数各位数字相加得到a。
2.若a>3 转 1
3.直接输出a
比如14
1 1 + 4 = 5;
2 a = 5 >3
1 5
2 a = 5;
..................
是这样吗?
yjh1982
2005-02-04
打赏
举报
回复
1.把这个数各位数字相加得到a。
2.若a>3 转 1
3.直接输出a
这个,能保证正确么?
pcboyxhy
2005-02-04
打赏
举报
回复
一个人回复了这么多
实在抱歉
pcboyxhy008
2005-02-04
打赏
举报
回复
原来关系运算符也不可以
如果下标运算也不可以
wk
csdn一个ID不能在一个问题下连续回复3篇,
只好换mj出来了。
循环链表的话就要用指针了
不知道 -> 和 .能不能用。
=是赋值运算符
不知道可以用不?
要是不能用=
我就不会做了。
此外还有[ ]运算符,
要是这个都不能用
只好手工判断了
反正只剩下几个而已
==运算符也是可以转换的
不再赘述
有没有想过能表示所有C运算符的极大线性无关组,并要求这个子集的模最小
谁有兴趣可以研究研究
贴出来给大家看看
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
long n, p, q, i;
int yushu[]={1, 2};
int yu[ ]={0,1,2,0};
cin>>n;
while(n>3)
{
i=0; q=0;
while(n)
{
p=i; p>>=1; p<<=1;
i=i-p;
p=n; p>>=1; p<<=1;
q+=(n-p)*yushu[i++];
n>>=1;
}
n=q;
}
cout<<endl<<yu[n];
system("PAUSE");
return 0;
}
Googol
2005-02-04
打赏
举报
回复
pcboyxhy,多谢你这么热心啊,不过你得第一种算法有取巧之嫌吧?
受你第二种算法的启发,改进了一下。不知道效率有没有提高,至少空间上效率高了。
#include <stdio.h>
main()
{
int n;
scanf("%d", &n);
int mo[]={0,1,2,0};
int i, m;
m = n;
i = 4;
while (i>3){
i = 0;
while(m>0)
{
i += m & 3;
m >>= 2;
}
m = i;
}
printf("%d", mo[i]);
}
pcboyxhy
2005-02-04
打赏
举报
回复
1.把这个数各位数字相加得到a。
2.若a>3 转 1
3.直接输出a
这个,能保证正确么?
~~~~~~~~~~~~
没看我代码吗?
我弄错了
是9,不是3
你们可以拿代码测试一下就知道了
pcboyxhy
2005-02-04
打赏
举报
回复
如果不能使用 &运算
可以这样替换
a&0x1 <==> {b=a; a>>1; a<<1;} 取a!=b
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
long n, p, q, i;
int yushu[]={1, 2};
int yu[ ]={0,1,2,0};
cin>>n;
while(n>3)
{
i=0; q=0;
while(n)
{
p=i; p>>=1; p<<=1;
i=i!=p;
p=n; p>>=1; p<<=1;
q+=(n!=p)*yushu[i++];
n>>=1;
}
n=q;
}
cout<<endl<<yu[n];
system("PAUSE");
return 0;
}
pcboyxhy
2005-02-04
打赏
举报
回复
还有一种做法就是:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
long n, p, q, i;
int yushu[]={1, 2};
int yu[ ]={0,1,2,0};
cin>>n;
while(n>3)
{
i=0; q=0;
while(n)
{
i&=0x1;
q+=(n&0x1)*yushu[i++];
n>>=1;
}
n=q;
}
cout<<endl<<yu[n];
system("PAUSE");
return 0;
}
以上两种解法均没有考虑负数和整数越界
pcboyxhy
2005-02-04
打赏
举报
回复
1.把这个数各位数字相加得到a。
2.若a>3 转 1
3.直接输出a
如下
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
long n, p;
int yushu[ ]={0,1,2,0,1,2,0,1,2,0};
cin>>n;
while(n>9)
{
long p=0, t;
while(n)
{
t=long(n*0.1);
p+=n-t*10;
n=t;
}
n=p;
}
cout<<endl<<yushu[n];
system("PAUSE");
return 0;
}
高效
的
求余
数
的办法((n-1)&hash)
然后就是&操作了,直接&8的话是不行的,假设最后四位是1XXX,那么1XXX&1000=1000,很明显对8取余得到的结果不可能是8,余
数
应在0到除
数
减一之间,Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种
高效
的
求余
数
的办法,但其中的原理是什么呢为什么可以这么做呢?(其余2n除
数
也同理)先上结论:假设被除
数
是x,对于除
数
是2n的取余操作x%2n,都可以写成x&(2n-1),位运算效率高!因为比8更高位的都来自于8的2次幂,所以高位的1都是可以整除8,可以直接舍弃。...
大整
数
求余
数
的问题分析
问题描述 最近在学习一些资料的时候正好看到一些和大整
数
求余
数
相关的问题,这些问题粗粗看来似乎有点麻烦。但是当结合一些有关
数
学的特性来分析时,会觉得很有意思。 问题1: 求一个整
数
X的N次方除以某个整
数
P的余
数
。用
数
学公式表示则如下: 其中N >= 0, P > 0. 这个问题需要考虑的就是如果N比较大的时候,很可能就超出我们所用一般
数
据...
acm-
求余
数
(同余定理)
求余
数
时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个自然
数
n,它的位
数
小于等于一百万,现在你要做的就是求出这个
数
除10003之后的余
数
输入 第一行有一个整
数
m(1 随后m行每行有一个自然
数
n。 输出 输出n整除10003之后的余
数
,每次输出占一行。 样例输入 3 4 5 465456541 样例输出 4
求任意整
数
模3的余
数
在回答这个问题之前,首先思考另一个问题:为什么是模3的余
数
,而不是2或5? 那是因为3很特殊,求一个
数
模3的余
数
时,有一种巧妙地解法。 算法 算法是将这个
数
的各位
数
字加起来,重复这一过程,直到最后得到一位
数
,这一位
数
模3的结果就是最终答案。 比如求17%3,1+7=8,8%3=2,于是17%3=2。 参考代码: func mod3(num int) int { sum := num for...
求余
数
求余
数
时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述现在给你一个自然
数
n,它的位
数
小于等于一百万,现在你要做的就是求出这个
数
除10003之后的余
数
输入第一行有一个整
数
m(1 随后m行每行有一个自然
数
n。 输出输出n整除10003之后的余
数
,每次输出占一行。 样例输入 3 4 5 465456541 样例输出 4
其它技术问题
3,881
社区成员
9,044
社区内容
发帖
与我相关
我的任务
其它技术问题
C/C++ 其它技术问题
复制链接
扫一扫
分享
社区描述
C/C++ 其它技术问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章