当前位置: 首页 > news >正文

C++中如何处理超长的数字(long long类型的整数都无法存储的)

C++中如何处理超长的数字(long long类型的整数都无法存储的)

在 C++中,如果数字超出了 long long 类型的范围,可以考虑使用字符串或第三方库(如 Boost.Multiprecision)来表示和处理超长数字。要使用第三方库需要下载并安装所需的第三方库,在此就不介绍了。

在此介绍使用字符串表示和处理超长数字。本文将介绍使用C++字符串实现超长的数字加法、减法、乘法和除法运算。

1.判断一个非负的超大数是奇数还是偶数,源码如下:

#include <iostream>  
#include <string>
using namespace std;  int main() {  
//string s = "123456789123456789123456789";
cout << "请输入一个正整数:" << endl;cin >> s;// s.size()是字符串的长度,即由多少字符组成的, 字符串的最后一位字符即s[s.size() - 1]char c = s[s.size() - 1];cout << "最后一位数字是" << c << endl;  // 将一个整数数字字符变成整数,我们只需要将它减字符'0'int i = c - '0';if (i % 2 == 0) {cout << s << "是偶数";} else {cout << s << "是奇数";}return 0;  
}

2.判断两个超大正整数的大小

#include <iostream>  
#include <string>  using namespace std;  bool Lower(string str1, string str2){     //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} int main() {  cout << "请输入两个超大正整数:" << endl;string a, b; cin >> a >> b; if (Lower(a, b)){cout << a << "小于" << b << endl;}else{cout << a << "大于" << b << endl;}return 0;  
}

下面分别介绍加法、减法、乘法和除法运算的实现方法。特别说明,加减运算仅限非负整数的运算,因为负数的加减运算可以等价为某种形式的加法或者减法运算,故不做考虑;乘除运算只考虑大整数运算,不考虑小数的计算;除法只考虑大整数运算,计算结果精确到6位小数(6位小数后直接舍去)。

参考https://blog.songjiahao.com/archives/382

3. 非负大整数的加法

大数加法的实现,模仿了我们列竖式的计算方法,从个位开始,一位一位的相加,每次考虑进位即可。由于读入的字符串0号位置为最高位,所以我们采用逆序的办法访问字符串,然后每位计算即可。同样的,因为计算时候得到的每一位都是逆序的,最后的结果要进行逆置。

加法,可能导致最终位数多一位(最高位的进位),所以要记得处理。

最后,我们来考虑一些特殊情况,比如两个数字都是0,或者其中有一个是0,我们就可以快速得到结果,省去了遍历过程。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>using namespace std; //判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入for(int i=0;i<size;i++)if(str[i]!='0') return false;return true;
}string Add(string str1, string str2){//关于0的处理if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0else if(CheckZero(str1)) return str2;               //如果有个一为0else if(CheckZero(str2)) return str1;string ans;int i=str1.size()-1,j=str2.size()-1;int flag=0;                                         //进位标记while(i>=0||j>=0||flag){int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替int numb=j>=0?str2[j--]-'0':0;flag=numa+numb+flag;                            //计算两位的和ans+='0'+flag%10;                               //取个位保存在答案中flag/=10;                                       //计算进位}reverse(ans.begin(),ans.end());return ans;
}int main(){cout << "请输入两个正整数:" << endl;string a, b;cin >> a >> b;string result = Add(a, b);  cout << "和:" << result << endl;  return 0;  
}

4. 非负大整数的减法

大数减法的实现,也模仿了我们列竖式的计算方法。从个位起,每次计算一位,首先根据后一位是否借位,先减去借位,然后判断当前位是否够减,如果需要借位,则向前一位借位后在减,直到运算完毕。同样的,因为我们要从个位开始计算,所以计算得到的结果必然是逆序的,最终要记得将结果逆置。

减法,可能出现前导0,要记得清除前导零。

最后,我们来考虑一些特殊情况,比如两个数相同或者有一个数字为0,我们可以直接得到结果,从而避免了复杂的处理过程。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>using namespace std; //判断两个超大正整数的大小 
bool Lower(string str1, string str2){     //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} //判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入for(int i=0;i<size;i++)if(str[i]!='0') return false;return true;
}string Sub(string str1, string str2){//处理0的情况if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0else if(CheckZero(str2)) return str1;                           //如果第二个数字为0//定正负int negative=0;                     //结果的正负号if(Lower(str1,str2)){swap(str1,str2);                //保证str1大于str2negative=1;                     //如果str1小于str2,则结果过为负值}string ans;int i=str1.size()-1,j=str2.size()-1;//逆序开始处理int flag=0;                         //借位标记while(i>=0||j>=0){int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0int numb=j>=0?str2[j--]-'0':0;numa-=flag;                     //先减去借位if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)numa+=10;                   //借位并记录借位flag=1;}else flag=0;                    //如果不借位,则借位标记为0ans+='0'+numa-numb;             //计算当前位置并保存}i=ans.size()-1;while(ans[i]=='0') i--;ans=ans.substr(0,i+1);              //去除前导0,如111-110=1if(negative) ans+='-';              //如果计算结果是负数,添加负数符号reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下return ans;
}int main(){cout << "请输入两个正整数:" << endl;string a, b;cin >> a >> b;string result = Sub(a, b);  cout << "差: " << result << endl;     return 0;  
}

5.大整数的乘法

大数乘法的实现,还采用我们竖式计算的方法。从个位开始,每次计算被乘数和乘数一位的积,然后借助我们写好的大数加法实现最终结果的累加。但是大数乘法需要考虑正负的问题,所以需要对正负号进行处理,对两个数的符号使用异或最终可以确定乘积结果的正负。

乘法,因为乘数的每一位都有相应的权值(个十百千万),因此我们对于乘数每一位的积进行运算时要考虑该位置的权值,在积的后边补充相应个数的零即可。

最后,我们考虑一些特殊情况,比如两个数字中只要有一个是0,则结果就是0。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>using namespace std; //判断两个超大正整数的大小 
bool Lower(string str1, string str2){     //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} //判断是否为负,只需要判断第一位是不是负号即可,这里不考虑正号的存在,即认为不使用正号
bool CheckNegative(const string &str){  //检查是否为负数return str[0]=='-';
}//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入for(int i=0;i<size;i++)if(str[i]!='0') return false;return true;
}string Add(string str1, string str2){//关于0的处理if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0else if(CheckZero(str1)) return str2;               //如果有个一为0else if(CheckZero(str2)) return str1;string ans;int i=str1.size()-1,j=str2.size()-1;int flag=0;                                         //进位标记while(i>=0||j>=0||flag){int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替int numb=j>=0?str2[j--]-'0':0;flag=numa+numb+flag;                            //计算两位的和ans+='0'+flag%10;                               //取个位保存在答案中flag/=10;                                       //计算进位}reverse(ans.begin(),ans.end());return ans;
}string Mul(string str1, string str2){if(CheckZero(str1)||CheckZero(str2)) return "0";    //如果有一个为0,则结果为0int negative=0,negastr1=0,negastr2=0;               //定正负if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-字符negastr1=1; str1=str1.substr(1,str1.size()-1);}if(CheckNegative(str2)){negastr2=1; str2=str2.substr(1,str2.size()-1);}negative=negastr1^negastr2;                         //异或运算确定结果的正负号string ans;if(Lower(str1,str2)) swap(str1,str2);               //保证str1大于等于str2int size1=str1.size(),size2=str2.size();for(int i=size2-1;i>=0;i--){                        //遍历较小数字的每一位string temp(size2-1-i,'0');                     //temp为str1乘以str2[i]的积,根据str2[i]的权重(个十百千万,补充对应个数的0)int flag=0;                                     //进位标记for(int j=size1-1;j>=0;j--){                    //tempflag+=(str1[j]-'0')*(str2[i]-'0');temp.push_back('0'+(flag%10));flag/=10;}if(flag) temp.push_back('0'+flag);              //如果最高位还有进位reverse(temp.begin(),temp.end());ans=Add(ans,temp);                              //将计算结果累加到最终的结果上}if(negative) ans="-"+ans;                           //处理结果的正负号return ans;
}int main(){cout << "请输入两个整数:" << endl;string a, b;cin >> a >> b;string result = Mul(a, b);  cout << "积:" << result << endl;     return 0;  
}

6. 大整数的除法,计算结果精确到6位小数(6位小数后直接舍去)

如商3.700014[5800933124]

大数除法的实现,同样采用我们除法式子的方法进行计算。首先,使用异或的方法确定结果的正负号。两个数字相除的时候,如果第一个数字大于等于第二个数字,则结果一定是大于等于1的,否则小于1。于是,为了实现小于1的结果表示,我们为结果精确到小数点后6位。这里采用的方法为:事先确定是否为纯小数,然后在第一个数字的末尾加上6个0,然后使用我们除法式子的方法进行计算。从第一个数字的头部开始,找到第一个长度能够进行商运算的数字开始,计算商并将临时的余数补足一位进行下一位商的计算,直到计算完毕。

除法,可能遇到除数为0的情况,因此需要在计算的时候提前进行判定。另外计算过程中,计算商的方法使用大数的减法操作,因此可能会遇到0堆积的情况(长度增大),会影响到大小的比较判定,要注意处理。

最后,我们考虑一些特殊情况,比如被除数为0的时候,可以直接输出结果0.000000。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>using namespace std; //判断两个超大正整数的大小 
bool Lower(string str1, string str2){     //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} //判断是否为负,只需要判断第一位是不是负号即可,这里不考虑正号的存在,即认为不使用正号
bool CheckNegative(const string &str){  //检查是否为负数return str[0]=='-';
}//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入for(int i=0;i<size;i++)if(str[i]!='0') return false;return true;
}//大数减法
string Sub(string str1, string str2){//处理0的情况if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0else if(CheckZero(str2)) return str1;                           //如果第二个数字为0//定正负int negative=0;                     //结果的正负号if(Lower(str1,str2)){swap(str1,str2);                //保证str1大于str2negative=1;                     //如果str1小于str2,则结果过为负值}string ans;int i=str1.size()-1,j=str2.size()-1;//逆序开始处理int flag=0;                         //借位标记while(i>=0||j>=0){int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0int numb=j>=0?str2[j--]-'0':0;numa-=flag;                     //先减去借位if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)numa+=10;                   //借位并记录借位flag=1;}else flag=0;                    //如果不借位,则借位标记为0ans+='0'+numa-numb;             //计算当前位置并保存}i=ans.size()-1;while(ans[i]=='0') i--;ans=ans.substr(0,i+1);              //去除前导0,如111-110=1if(negative) ans+='-';              //如果计算结果是负数,添加负数符号reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下return ans;
}string Div(string str1, string str2){//处理除数为0的情况和被除数为0的情况if(CheckZero(str2)) return "The divisor cannot be zero!";else if(CheckZero(str1)) return "0.000000";int negative=0,negastr1=0,negastr2=0;               //定正负if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-negastr1=1; str1=str1.substr(1,str1.size()-1);}if(CheckNegative(str2)){negastr2=1; str2=str2.substr(1,str2.size()-1);}negative=negastr1^negastr2;                         //异或运算确定结果的正负号int point=0;                                        //结果是否为纯小数if(Lower(str1,str2)) point=1;                       //如果str1小于str2,则计算为纯小数string ans;                                         //计算结果str1+=string(6,'0');                                //补足6个0,用于计算小数位int size1=str1.size(),size2=str2.size();int i=size2-1;                                      //商第一位的位置string temp=str1.substr(0,i);                       //从str1上取size2-1个字符for(i;i<size1;i++){temp+=str1[i];                                  //从后边拿出一位,预先处理可以防止结尾处越界int cnt=0;                                      //当前位的商,也就是temp中包含了多少个str2,使用减法                                          //如果temp不为0,则计算商while(Lower(str2,temp)||temp==str2){            //如果当前位商不为0,则计算商temp=Sub(temp,str2);cnt++;}if(temp=="0") temp.clear();                     //如果某次计算结果为0,则清空,避免0的堆积,比如111000 111ans.push_back('0'+cnt);                         //保存商}i=0;while(ans[i]=='0') i++;ans=ans.substr(i,ans.size()-i);                     //去除前导0if(point){                                          //如果是纯小数,补足6位并添加小数点int len=6-ans.size();ans="0."+string(len,'0')+ans;}else ans.insert((ans.end()-6),'.');                 //如果不是小数,则只需要插入小数点       if(negative) ans="-"+ans;                           //最后一步骤,如果是负数带上负号return ans;
}int main(){cout << "请输入两个整数:" << endl;string a, b;cin >> a >> b;string result = Div(a, b);  cout << "商(6位小数后直接舍去):" << result << endl;     return 0;  
}

7.最后,整合为大数四则运算

加减运算仅限非负整数的运算,因为负数的加减运算可以等价为某种形式的加法或者减法运算,故不做考虑;乘除运算只考虑大整数运算,不考虑小数的计算;除法只考虑大整数运算,计算结果精确到6位小数(6位小数后直接舍去)。源码如下:

#include <iostream>  
#include <string>  
#include <algorithm>using namespace std;  //大数四则运算,两个参数都不能为空
string Add(string str1, string str2);       //大数加法
string Sub(string str1, string str2);       //大数减法
string Mul(string str1, string str2);       //大数乘法
string Div(string str1, string str2);       //大数除法
bool Lower(string str1, string str2);       //大数比较(小于)
bool CheckZero(const string &str);          //检查是不是0,比如0000认为是0
bool CheckNegative(const string &str);      //检查是不是负数
void ShowMenu();                            //提示菜单
void ShowMenu(char choice);                 //二级菜单
int main(){string a,b;char ch;ShowMenu();while(cin>>ch&&ch!='q'){                //循环打印菜单并提示用户输入ShowMenu(ch);cin>>a>>b;switch(ch){case 'a':cout<<a<<" + "<<b<<" = "<<Add(a,b)<<endl;break;case 'b':cout<<a<<" - "<<b<<" = "<<Sub(a,b)<<endl;break;case 'c':cout<<a<<" * "<<b<<" = "<<Mul(a,b)<<endl;break;case 'd':cout<<a<<" / "<<b<<" = "<<Div(a,b)<<endl;break;}ShowMenu();}return 0;
}
string Add(string str1, string str2){//关于0的处理if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0else if(CheckZero(str1)) return str2;               //如果有个一为0else if(CheckZero(str2)) return str1;string ans;int i=str1.size()-1,j=str2.size()-1;int flag=0;                                         //进位标记while(i>=0||j>=0||flag){int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替int numb=j>=0?str2[j--]-'0':0;flag=numa+numb+flag;                            //计算两位的和ans+='0'+flag%10;                               //取个位保存在答案中flag/=10;                                       //计算进位}reverse(ans.begin(),ans.end());return ans;
}
string Sub(string str1, string str2){//处理0的情况if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0else if(CheckZero(str2)) return str1;                           //如果第二个数字为0//定正负int negative=0;                     //结果的正负号if(Lower(str1,str2)){swap(str1,str2);                //保证str1大于str2negative=1;                     //如果str1小于str2,则结果过为负值}string ans;int i=str1.size()-1,j=str2.size()-1;//逆序开始处理int flag=0;                         //借位标记while(i>=0||j>=0){int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0int numb=j>=0?str2[j--]-'0':0;numa-=flag;                     //先减去借位if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)numa+=10;                   //借位并记录借位flag=1;}else flag=0;                    //如果不借位,则借位标记为0ans+='0'+numa-numb;             //计算当前位置并保存}i=ans.size()-1;while(ans[i]=='0') i--;ans=ans.substr(0,i+1);              //去除前导0,如111-110=1if(negative) ans+='-';              //如果计算结果是负数,添加负数符号reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下return ans;
}
string Mul(string str1, string str2){if(CheckZero(str1)||CheckZero(str2)) return "0";    //如果有一个为0,则结果为0int negative=0,negastr1=0,negastr2=0;               //定正负if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-字符negastr1=1; str1=str1.substr(1,str1.size()-1);}if(CheckNegative(str2)){negastr2=1; str2=str2.substr(1,str2.size()-1);}negative=negastr1^negastr2;                         //异或运算确定结果的正负号string ans;if(Lower(str1,str2)) swap(str1,str2);               //保证str1大于等于str2int size1=str1.size(),size2=str2.size();for(int i=size2-1;i>=0;i--){                        //遍历较小数字的每一位string temp(size2-1-i,'0');                     //temp为str1乘以str2[i]的积,根据str2[i]的权重(个十百千万,补充对应个数的0)int flag=0;                                     //进位标记for(int j=size1-1;j>=0;j--){                    //tempflag+=(str1[j]-'0')*(str2[i]-'0');temp.push_back('0'+(flag%10));flag/=10;}if(flag) temp.push_back('0'+flag);              //如果最高位还有进位reverse(temp.begin(),temp.end());ans=Add(ans,temp);                              //将计算结果累加到最终的结果上}if(negative) ans="-"+ans;                           //处理结果的正负号return ans;
}
string Div(string str1, string str2){//处理除数为0的情况和被除数为0的情况if(CheckZero(str2)) return "The divisor cannot be zero!";else if(CheckZero(str1)) return "0.000000";int negative=0,negastr1=0,negastr2=0;               //定正负if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-negastr1=1; str1=str1.substr(1,str1.size()-1);}if(CheckNegative(str2)){negastr2=1; str2=str2.substr(1,str2.size()-1);}negative=negastr1^negastr2;                         //异或运算确定结果的正负号int point=0;                                        //结果是否为纯小数if(Lower(str1,str2)) point=1;                       //如果str1小于str2,则计算为纯小数string ans;                                         //计算结果str1+=string(6,'0');                                //补足6个0,用于计算小数位int size1=str1.size(),size2=str2.size();int i=size2-1;                                      //商第一位的位置string temp=str1.substr(0,i);                       //从str1上取size2-1个字符for(i;i<size1;i++){temp+=str1[i];                                  //从后边拿出一位,预先处理可以防止结尾处越界int cnt=0;                                      //当前位的商,也就是temp中包含了多少个str2,使用减法                                          //如果temp不为0,则计算商while(Lower(str2,temp)||temp==str2){            //如果当前位商不为0,则计算商temp=Sub(temp,str2);cnt++;}if(temp=="0") temp.clear();                     //如果某次计算结果为0,则清空,避免0的堆积,比如111000 111ans.push_back('0'+cnt);                         //保存商}i=0;while(ans[i]=='0') i++;ans=ans.substr(i,ans.size()-i);                     //去除前导0if(point){                                          //如果是纯小数,补足6位并添加小数点int len=6-ans.size();ans="0."+string(len,'0')+ans;}else ans.insert((ans.end()-6),'.');                 //如果不是小数,则只需要插入小数点       if(negative) ans="-"+ans;                           //最后一步骤,如果是负数带上负号return ans;
}
bool Lower(string str1, string str2){                   //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
}
bool CheckZero(const string &str){      //检查是否等于0int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入for(int i=0;i<size;i++)if(str[i]!='0') return false;return true;
}
bool CheckNegative(const string &str){  //检查是否为负数return str[0]=='-';
}
void ShowMenu(){cout<<"请选择要进行的大数运算:\n"<<"a) 加法          b) 减法\n"<<"c) 乘法          d) 除法\n"<<"q) 退出\n"<<"请输入你的选择: ";
}
void ShowMenu(char choice){cout<<"请输入要计算的两个数字";switch(choice){case 'a':cout<<"(仅支持非负整数加法计算): "<<endl;break;case 'b':cout<<"(仅支持非负整数减法计算): "<<endl;break;case 'c':cout<<"(仅支持整数乘法计算): "<<endl;break;case 'd':cout<<"(仅支持整数除法计算,计算结果保留6位小数,之后的直接舍弃): "<<endl;break;}
}

相关文章:

C++中如何处理超长的数字(long long类型的整数都无法存储的)

C中如何处理超长的数字&#xff08;long long类型的整数都无法存储的&#xff09; 在 C中&#xff0c;如果数字超出了 long long 类型的范围&#xff0c;可以考虑使用字符串或第三方库&#xff08;如 Boost.Multiprecision&#xff09;来表示和处理超长数字。要使用第三方库需…...

RabbitMQ MQTT集群方案官方说明

RabbitMQ MQTT 官方网说明 官方地址: https://www.rabbitmq.com/mqtt.html 从3.8开始&#xff0c;该MQTT插件要求存在一定数量的群集节点。这意味着三分之二&#xff0c;五分之三&#xff0c;依此类推。 该插件也可以在单个节点上使用&#xff0c;但不支持两个节点的集群。 如…...

深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站

​ 2023年9月20~22日&#xff0c;深圳唯创知音电子将在 深圳宝安国际会展中心&#xff08;9号馆9B1&#xff09;为您全面展示最新的芯片产品及应用方案&#xff0c;助力传感器行业的发展。 作为全球领先的芯片供应商之一&#xff0c;深圳唯创知音电子一直致力于为提供高质量、…...

《TCP/IP网络编程》阅读笔记--I/O复用

目录 1--基于I/O复用的服务器 2--select()函数 3--基于I/O复用的回声服务器端 4--send()和recv()函数的常用可选项 5--readv()和writev()函数 1--基于I/O复用的服务器 多进程服务器端具有以下缺点&#xff1a;当有多个客户端发起连接请求时&#xff0c;就会创建多个进程来…...

[C#] 允许当前应用程序通过防火墙

通常在一台装有防火墙的电脑上运行程序的场合&#xff0c;往往会弹出对话框提示&#xff1a;是否允许执行该应用程序。 我们在开发软件的时候&#xff0c;可以事先在软件里面设置当前软件为防火墙允许通过的软件。这样&#xff0c;用户在使用时就可以避开前面提到的弹框了。 在…...

帆软FineReport决策报表Tab实现方案

最近有个需求是要做首页展示&#xff0c;为了减少前端工作量&#xff0c;利用采购的帆软FineReport来实现&#xff0c;记录过程&#xff0c;方便备查。 需求 做个Tab页&#xff0c;实现多个页切换。 方案一、利用帆软自带切换 帆软自带的有Tab控件&#xff0c;可实现切换&a…...

只打印文名

CMakeLists.txt set(CMAKE_C_FLAGS "-O0 -ggdb -D__NOTDIR_FILE__$(notdir $<)") // set(CMAKE_C_FLAGS "-O0 -ggdb -D__NOTDIR_FILE__$(notdir $<) -D__FILENAME__$(subst $(dir $<),,$<)")C文件 #include <stdio.h>#ifdef __NOTDIR_…...

【经典小练习】JavaSE—拷贝文件夹

&#x1f38a;专栏【Java小练习】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;效果&#x1f33a;代码&#x1f6f8;讲解&#x…...

FPGA-结合协议时序实现UART收发器(六):仿真模块SIM_uart_drive_TB

FPGA-结合协议时序实现UART收发器&#xff08;六&#xff09;&#xff1a;仿真模块SIM_uart_drive_TB 仿真模块SIM_uart_drive_TB&#xff0c;仿真实现。 vivado联合modelsim进行仿真。 文章目录 FPGA-结合协议时序实现UART收发器&#xff08;六&#xff09;&#xff1a;仿真模…...

Spring Boot集成EasyExcel实现数据导出

在本文中&#xff0c;我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件&#xff0c;并实现一些高级功能&#xff0c;如支持列下拉和自定义单元格样式&#xff0c;自适应列宽、行高&#xff0c;动态表头 &#xff…...

EasyExcel3.0读(日期、数字或者自定义格式转换)

EasyExcel 3.0读(日期、数字或者自定义格式转换) 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>对象 package com.xiaobu.entity.vo;import …...

浅谈C++|STL之vector篇

一.vector的基本概念 vector是C标准库中的一种动态数组容器&#xff0c;提供了动态大小的数组功能&#xff0c;能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素&#xff0c;可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点&#xff1a; 动…...

微信、支付宝修改步数【小米运动】

简介 小米运动是一款流行的健身应用,可以记录用户的步数和运动数据。然而,有些用户希望能够修改步数,以达到一些特定的目的。本文将介绍一个Python脚本,可以帮助用户实现修改小米运动步数的功能。 正文 脚本介绍: 本脚本是一个Python脚本,用于修改小米运动步数。通过模…...

stu02-初识HTML

1.HTML概述 &#xff08;1&#xff09;HTML是Hyper Text Mark-up Language的首字母缩写。 &#xff08;2&#xff09;HTML是一种超文本标记语言。 &#xff08;3&#xff09; 超文本&#xff1a;指除了文字外&#xff0c;页面内还可以包含图片、链接、甚至音乐、视频等非文字元…...

软件测试7大误区

随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…...

【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象&#xff08;ndarray&#xff09; 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. n…...

CSS宽度问题

一、魔法 为 DOM 设置宽度有哪些方式呢&#xff1f;最常用的是配置width属性&#xff0c;width属性在配置时&#xff0c;也有多种方式&#xff1a; widthmin-widthmax-width 通常当配置了 width 时&#xff0c;不会再配置min-width max-width&#xff0c;如果将这三者混合使…...

浅谈C++|STL之string篇

一.string的基本概念 本质 string是C风格的字符串&#xff0c;而string本质是一个字符串 string和char * 区别 char * 是一个指针string是一个类&#xff0c;类内部封装了char *&#xff0c;管理这个字符串&#xff0c;是一个char * 型容器。 特点 string类内部封装了很多成…...

Kubernetes Dashboard安装部署

Kubernetes Dashboard安装部署 1. 下载Dashboard 部署文件2. 修改yaml配置文件3. 应用安装&#xff0c;查看pod和svc4. 创建dashboard服务账户5. 创建admin-user用户的登录密钥6. 登录6.1 使用token登录(1) 短期token(2) token长期有效 6.2 使用 Kubeconfig 文件登录 7.安装met…...

在Qt的点云显示窗口中添加坐标轴C++

通过摸索整理了三个方法&#xff1a; 一、方法1&#xff1a;//不推荐&#xff0c;但可以参考 1、通过pcl的compute3DCentroid()方法计算点云的中心点坐标&#xff1b; 函数原型如下&#xff1a; compute3DCentroid (const pcl::PointCloud<PointT> &cloud, Eigen…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...