描述
二进制数 n 除以二进制数 m 的二进制余数是多少?
输入:
第一行输入一个二进制数 n(n > 0),n 的长度(二进制数的位数)≤200000。
第二行输入一个二进制数 m(m > 0),m 的长度(二进制数的位数)≤20。
输出:
输出 n 除以 m 的余数。
样例:
输入1:
1010101010
111000
输出1:
1010
输入2:
100
10
输出2:
0
交了11次了,一直40分,听说好像要用到高精度的知识,但是我不会啊~,求帮助!
#include
#include
using namespace std;
void ejz(long long x){//就一位一位输出
if(x>1) ejz(x/2);
cout<2;
}
int quyu(string str,long long num){
long long i,len,ans=0;
len = str.size();
for(i=0;i10+str[i]-'0'; //前一位上的数的余数*10+当前位上的数
ans=ans%num;
}
return ans;
}
int main()
{
long long n=0,m=0,o;
char c=' ';
string str,str2;
while(c!='0'&&c!='1') c=getchar();//c初始化是空格,不然会报错
while(c=='0'||c=='1') n=n*2+(c=='1'),c=getchar();str=to_string(n);//一直存入c直到不是0或者1,然后加进n
while(c!='0'&&c!='1') c=getchar();//刚刚结束后c是\n,重新存入以下,不然会报错
while(c=='0'||c=='1') m=m*2+(c=='1'),c=getchar();str2=to_string(m);//一直存入c直到不是0或者1,然后加进n
o=quyu(str,m);
ejz(o);
return 0;
}
#pragma once
#include<deque>
#include<string>
namespace MyStd
{
class CBigInt;
class CUnsignedBigInt;
class MulBuffer;
class CUnsignedBigInt
{
protected:
friend class MulBuffer;
using valueType = uint32_t;
std::deque<valueType> m_data;//数字
static CUnsignedBigInt Mul(CUnsignedBigInt n1, valueType n2);//计算CUnsignedBigInt与一位数相乘的结果
void Reduced();//化简(去掉前导0)
public:
static const short m_radix = 10;//使用10进制存储,可以改,结果不会变
static inline const CUnsignedBigInt& UnsignedLongLongMax()noexcept;
static inline const CUnsignedBigInt& LongLongMax()noexcept;
CUnsignedBigInt();
CUnsignedBigInt(unsigned long long num);
CUnsignedBigInt(const CUnsignedBigInt& i);
CUnsignedBigInt(CUnsignedBigInt&& i);
CUnsignedBigInt(const std::string& source, uint8_t radix = 10);
size_t Size()const noexcept;//位数
valueType At(size_t index)const;
CUnsignedBigInt SubNum(size_t first, size_t count = 1)const;
virtual std::string ToString(uint8_t radix = 10)const;//radix范围为2-16
CUnsignedBigInt& operator=(unsigned long long num);
CUnsignedBigInt& operator=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator=(CUnsignedBigInt&& n);
virtual CUnsignedBigInt& operator=(const std::string& source);
virtual void Assign(const std::string& source, uint8_t radix = 10);
void Assign(unsigned long long num);
bool IsZero()const;
friend std::strong_ordering operator<=>(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2)noexcept;
static std::strong_ordering Compare(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend bool operator==(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend bool operator!=(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator+(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator-(CUnsignedBigInt n1, const CUnsignedBigInt& n2);//计算差的绝对值
friend CUnsignedBigInt operator*(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
static CUnsignedBigInt Divide(const CUnsignedBigInt& n1, CUnsignedBigInt n2, CUnsignedBigInt& remainder);//除法,结果向0舍入,例如(-7)/5=-1
friend CUnsignedBigInt operator/(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator%(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
CUnsignedBigInt& operator+=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator-=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator*=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator/=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator%=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator++();
CUnsignedBigInt& operator--();
CUnsignedBigInt operator++(int);
CUnsignedBigInt operator--(int);
static CUnsignedBigInt Add(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
static CUnsignedBigInt Sub(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
CBigInt operator-()const;
const CUnsignedBigInt& operator+()const noexcept;
static CUnsignedBigInt Pow(CUnsignedBigInt n, unsigned long long exponential);//使用快速幂
static CUnsignedBigInt Pow(const CUnsignedBigInt& n, CUnsignedBigInt exponential);//不使用快速幂
static CUnsignedBigInt GCD(CUnsignedBigInt n1, CUnsignedBigInt n2);
static CUnsignedBigInt LCM(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
unsigned long long ToUnsignedLongLong()const;
virtual long double ToLongDouble()const;
};
class CBigInt :public CUnsignedBigInt
{
private:
friend class MulBuffer;
bool m_sign;//1正0负
public:
CBigInt();
CBigInt(long long num);
CBigInt(const CBigInt& i);
CBigInt(CBigInt&& i);
CBigInt(const CUnsignedBigInt& i);
CBigInt(CUnsignedBigInt&& i);
CBigInt(const std::string& source, uint8_t radix = 10);
CUnsignedBigInt Abs()const noexcept;
virtual std::string ToString(uint8_t radix = 10, bool ShowPlusSign = false)const;//radix范围为2-16
CBigInt& operator=(long long num);
CBigInt& operator=(const CBigInt& n);
CBigInt& operator=(CBigInt&& n);
virtual CBigInt& operator=(const std::string& source);
virtual void Assign(const std::string& source, uint8_t radix = 10);
static std::strong_ordering Compare(const CBigInt& n1, const CBigInt& n2);
friend std::strong_ordering operator<=>(const CBigInt& n1, const CBigInt& n2)noexcept;
friend bool operator==(const CBigInt& n1, const CBigInt& n2);
friend bool operator!=(const CBigInt& n1, const CBigInt& n2);
friend CBigInt operator+(CBigInt n1, const CBigInt& n2);
friend CBigInt operator-(CBigInt n1, const CBigInt& n2);
friend CBigInt operator*(CBigInt n1, const CBigInt& n2);
static CBigInt Divide(const CBigInt& n1, const CBigInt& n2, CBigInt& remainder);//除法,结果向0舍入,例如(-7)/5=-1
friend CBigInt operator/(const CBigInt& n1, const CBigInt& n2);
friend CBigInt operator%(const CBigInt& n1, const CBigInt& n2);
CBigInt& operator+=(const CBigInt& n);
CBigInt& operator-=(const CBigInt& n);
CBigInt& operator*=(const CBigInt& n);
CBigInt& operator/=(const CBigInt& n);
CBigInt& operator%=(const CBigInt& n);
CBigInt& operator
我首页置顶博客有个高精度代码
实在不行贴代码也行啊~