关于除以2的n次方求余数的思考

本人由于刚接触编程不久,思考的问题没有大家的那么深入。这次我仅仅只是一点基于学习的思考。今天在家里复习学校学过的功课,关于运算操作符的那一章节。  编写一个程序:从界面输入一个整数,要求求该数除以8后的余数。这个题目确实很简单,只要用%运算即可。但是我写出代码后发现编译器对于负数求模运算后所得的余数是负数。当然大家很容易想到此时加上除数即可达到题目的要求。我想这个代码大都会写,我就不再细述,但是今天我想输得方法并不是此。一个整型(int)占4个字节,每个字节8位。那么每个int占32个位。如果我们把该整数化成8进制,那么其8进制表示的数的个位数就是所求的余数。因为如果一个8进制数是xyz,那么其等于x*8*8+y*8+z;除以8取余就是z;那么我们再联想到计算机的存储数据的方式,二进制。而二进制转化成8进制的最简单的方法则是将该二进制从右至左按每三个数为一单元转化为8进制作为一位。不够的补0;那么由此可知,其正余数就是该数二进制表示的末尾3位数。 那么只要用与运算去保留后三位。即该数与上二进制(111)即可,而从界面输入的是10进制,则要考虑转化,很容易知道其为7。故设输入的数位num,则num&7所得结果即是。

而对于2的n次方作为除数是则只要num&(2的n次方-1)

#include<iostream>
using namespace std;

int main()
{
    int num;//输入的整数
    int i;//由于考虑除数不同,在此自己设置除数2的n次方
    cout<<"请输入一个整数:";
    cin>>num;
    cout<<"请输入除数:";
    cin>>i;
    num=num&(i-1);
    cout<<num<<endl;
    return 0;
}

  

时间: 2024-08-02 10:57:26

关于除以2的n次方求余数的思考的相关文章

NYOJ 102 次方求模

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 算法分析: 大数问题,需要利用快速幂取模算法. 所谓的快速幂,实际上是快速幂取模的缩

nyoj 次方求模

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 #include<cstdio> #include<cstdlib

nyoj_205_求余数_201404271630

求余数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数 输入 第一行有一个整数m(1<=m<=8),表示有m组测试数据:随后m行每行有一个自然数n. 输出 输出n整除10003之后的余数,每次输出占一行. 样例输入 3 4 5 465456541 样例输出 4 5 6948 来源 经典题目 上传者   1 #include <stdio.h> 2 #incl

如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】

Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5930    Accepted Submission(s): 4146 Problem Description As we know, Big Number is always troublesome. But it's really important in our

求余数 NYOJ 205

1 #include<stdio.h>//求余数(205) 2 #include<string.h> 3 char a[1000005]; 4 int main() 5 { 6 int x,i,t,res; 7 scanf("%d",&x); 8 while(x--){ 9 scanf("%s",a); 10 t=strlen(a); 11 if(t<=5){ 12 res=0; 13 for(i=0;i<t;i++){

次方求模 NYOJ 102

1 #include<stdio.h>//次方求模(102) 2 long long power(int a,int b,int c) 3 { 4 long long t; 5 if(b==0)return 1%c; 6 if(b==1)return a%c; 7 t=power(a,b/2,c); 8 t=t*t%c; 9 if(b&1)return t*a%c; 10 else return t; 11 } 12 int main() 13 { 14 int x; 15 long

nyoj 102 次方求模【快速幂】

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 注意用long long 型 #include<stdio.h> #def

次方求模

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 来源 [张云聪]原创 上传者 张云聪 参考:http://acm.nyist.net

求余数

描述现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数除10003之后的余数 输入 第一行有一个整数m(1<=m<=8),表示有m组测试数据:随后m行每行有一个自然数n. 输出 输出n整除10003之后的余数,每次输出占一行. 样例输入 3 4 5 465456541 样例输出 4 5 6948 1 /** 2 * 3 * @author YoungChan 4 * 5 */ 6 import java.util.*; 7 8 public class Reminder