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中如何处理超长的数字(long long类型的整数都无法存储的) 在 C中,如果数字超出了 long long 类型的范围,可以考虑使用字符串或第三方库(如 Boost.Multiprecision)来表示和处理超长数字。要使用第三方库需…...
RabbitMQ MQTT集群方案官方说明
RabbitMQ MQTT 官方网说明 官方地址: https://www.rabbitmq.com/mqtt.html 从3.8开始,该MQTT插件要求存在一定数量的群集节点。这意味着三分之二,五分之三,依此类推。 该插件也可以在单个节点上使用,但不支持两个节点的集群。 如…...
深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站
2023年9月20~22日,深圳唯创知音电子将在 深圳宝安国际会展中心(9号馆9B1)为您全面展示最新的芯片产品及应用方案,助力传感器行业的发展。 作为全球领先的芯片供应商之一,深圳唯创知音电子一直致力于为提供高质量、…...
《TCP/IP网络编程》阅读笔记--I/O复用
目录 1--基于I/O复用的服务器 2--select()函数 3--基于I/O复用的回声服务器端 4--send()和recv()函数的常用可选项 5--readv()和writev()函数 1--基于I/O复用的服务器 多进程服务器端具有以下缺点:当有多个客户端发起连接请求时,就会创建多个进程来…...
[C#] 允许当前应用程序通过防火墙
通常在一台装有防火墙的电脑上运行程序的场合,往往会弹出对话框提示:是否允许执行该应用程序。 我们在开发软件的时候,可以事先在软件里面设置当前软件为防火墙允许通过的软件。这样,用户在使用时就可以避开前面提到的弹框了。 在…...
帆软FineReport决策报表Tab实现方案
最近有个需求是要做首页展示,为了减少前端工作量,利用采购的帆软FineReport来实现,记录过程,方便备查。 需求 做个Tab页,实现多个页切换。 方案一、利用帆软自带切换 帆软自带的有Tab控件,可实现切换&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—拷贝文件夹
🎊专栏【Java小练习】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🎄效果🌺代码🛸讲解&#x…...
FPGA-结合协议时序实现UART收发器(六):仿真模块SIM_uart_drive_TB
FPGA-结合协议时序实现UART收发器(六):仿真模块SIM_uart_drive_TB 仿真模块SIM_uart_drive_TB,仿真实现。 vivado联合modelsim进行仿真。 文章目录 FPGA-结合协议时序实现UART收发器(六):仿真模…...
Spring Boot集成EasyExcel实现数据导出
在本文中,我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件,并实现一些高级功能,如支持列下拉和自定义单元格样式,自适应列宽、行高,动态表头 ÿ…...
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标准库中的一种动态数组容器,提供了动态大小的数组功能,能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素,可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点: 动…...
微信、支付宝修改步数【小米运动】
简介 小米运动是一款流行的健身应用,可以记录用户的步数和运动数据。然而,有些用户希望能够修改步数,以达到一些特定的目的。本文将介绍一个Python脚本,可以帮助用户实现修改小米运动步数的功能。 正文 脚本介绍: 本脚本是一个Python脚本,用于修改小米运动步数。通过模…...
stu02-初识HTML
1.HTML概述 (1)HTML是Hyper Text Mark-up Language的首字母缩写。 (2)HTML是一种超文本标记语言。 (3) 超文本:指除了文字外,页面内还可以包含图片、链接、甚至音乐、视频等非文字元…...
软件测试7大误区
随着软件测试对提高软件质量重要性的不断提高,软件测试也不断受到重视。但是,国内软件测试过程的不规范,重视开发和轻视测试的现象依旧存在。因此,对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识…...
【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作
目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. n…...
CSS宽度问题
一、魔法 为 DOM 设置宽度有哪些方式呢?最常用的是配置width属性,width属性在配置时,也有多种方式: widthmin-widthmax-width 通常当配置了 width 时,不会再配置min-width max-width,如果将这三者混合使…...
浅谈C++|STL之string篇
一.string的基本概念 本质 string是C风格的字符串,而string本质是一个字符串 string和char * 区别 char * 是一个指针string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。 特点 string类内部封装了很多成…...
Kubernetes Dashboard安装部署
Kubernetes Dashboard安装部署 1. 下载Dashboard 部署文件2. 修改yaml配置文件3. 应用安装,查看pod和svc4. 创建dashboard服务账户5. 创建admin-user用户的登录密钥6. 登录6.1 使用token登录(1) 短期token(2) token长期有效 6.2 使用 Kubeconfig 文件登录 7.安装met…...
在Qt的点云显示窗口中添加坐标轴C++
通过摸索整理了三个方法: 一、方法1://不推荐,但可以参考 1、通过pcl的compute3DCentroid()方法计算点云的中心点坐标; 函数原型如下: compute3DCentroid (const pcl::PointCloud<PointT> &cloud, Eigen…...
[密码学入门]凯撒密码(Caesar Cipher)
密码体质五元组:P,C,K,E,D P,plaintext,明文空间 C,ciphertext,密文空间 K,key,密钥空间 E,encrypt,加密算法 D,decrypt,解密算法 单表代换…...
uboot 顶层Makefile-make xxx_deconfig过程说明三
一. uboot 的 make xxx_deconfig配置 本文接上一篇文章的内容。地址如下:uboot 顶层Makefile-make xxx_deconfig过程说明二_凌肖战的博客-CSDN博客 本文继续来学习 uboot 源码在执行 make xxx_deconfig 这个配置过程中,顶层 Makefile有关的执行思路。 …...
c++中的多线程通信
信息传递 #include <iostream> #include <thread> #include <chrono> #include <mutex> #include <condition_variable> #include <queue> // 用于存储和同步数据的结构 struct Data {std::queue<std::string> messag…...
IO day7
1->x.mind 2-> A进程 B进程...
C语言之指针进阶篇(3)
目录 思维导图 回调函数 案例1—计算器 案例2—qsort函数 关于qsort函数 演示qsort函数的使用 案例3—冒泡排序 整型数据冒泡排序 回调函数搞定各类型冒泡排序 cmp_int比较大小 cmp传参数 NO1. NO2. 解决方案 交换swap 总代码 今天我们学习指针难点之回调函数…...
SQL7 查找年龄大于24岁的用户信息
描述 题目:现在运营想要针对24岁以上的用户开展分析,请你取出满足条件的设备ID、性别、年龄、学校。 用户信息表:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20…...
vite搭建vue3项目
参考视频 1.使用npm搭建vite项目,会自动搭建vue3项目 npm create vitelatest yarn create vite2.手动搭建vue3项目 创建一个项目名称的文件夹执行命令:npm init -y 快速的创建一个默认的包信息安装vite: npm i vite -D -D开发环境的依赖 安装vue,现在默认是vue3.…...
Qt中表格属性相关操作,调整表格宽度高度自适应内容等
1 表格列宽设置 利用Qt designer设计,可以通过改变表头的列宽从而保证内容不会被遮盖,输入空格的方式增加表头的长度,比如表头为"Value",则改成"Value ",可以扩展列默认的宽度,保证后面…...
NLP机器翻译全景:从基本原理到技术实战全解析
目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…...
docker四种网络模式
文章目录 一.为什么要了解docker网络二.docker 网络理论三.docker的四类网络模式3.1 bridge模式3.2 host模式3.3 container模式3.4 none模式 四.bridge模式下容器的通信4.1 防火墙开启状态4.2 防火墙关闭状态 一.为什么要了解docker网络 当你开始大规模使用Docker时࿰…...
顶呱呱网站建设价格/百度云搜索引擎入口 百度网盘
对于搜索引擎的搜索准确度影响很大1.基于字符串匹配(机械分词) 一般作为一个初分手段(1)正向最大匹配法(需要充分大的词典)例子: 将句子 ’ 今天来了许多新同事 ’ 分词。 设最大词长为5今天来了许今天来…...
全屏网站宽度/图片在线转外链
1)、把<script>标签放在<head>中意味着必须等到全部的js代码都下载解析和执行完成以后,才开始展现页面内容,为避免这个问题一般把js代码全部放在<body>元素内容后面 2)、script标签不带defer和async属性&#…...
廊坊那家做网站排行榜/微信朋友圈广告推广代理
深入学习JVM内存设置原理和调优这里向大家描述一下JVM内存设置原理和内存调优,设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。JVM内存设置原理默认的java虚拟机的大小比较小,在对大数据进行…...
网站建设的好处有什么用/引擎seo如何优化
系统流程如下图所示 首先数据交换流程为数据库<—>后台<---->前台 Dao层负责和数据库进行数据交互,services负责事务逻辑处理,action为struts部分,主要负责页面跳转时的数据传送。在web.xml文件中,有 <?xml version"1…...
日照有做渔家网站的吗/重庆seo点击工具
从输入URL地址到显示完整的页面Webkit都做了哪些事情 从输入地址到获取到数据的流程 1、输入URL地址,如:http://www.yejm16361.com/demo...。 2、DNS解析URL地址中的域名返回IP地址(如果是主机名是IP地址就跳过该步骤)。 3、 建立TCP连接&…...
盐城网站建设制作方案/制作网站的基本步骤
1、前言 面试官:“看过Spring源码吧,简单说说Spring中Bean的生命周期” 大神仙:“基本生命周期会经历实例化 -> 属性赋值 -> 初始化 -> 销毁”。 面试官:“......” 2、Bean的生命周期 如果是普通Bean的生命周期&am…...