如何高效求余数?

Googol 2005-02-04 02:15:34
面试题,只有+ - *和移位运算,如何计算一个数除3的余数?要求效率。

一次次减3的算法效率低。

好像和循环链表有关,哪位dx能帮忙想个算法?
...全文
394 10 打赏 收藏 转发到动态 举报
写回复
用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;
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧