一、進制轉換(字符串的操作)
在進制轉換的過程中,操作的數字可能大於int的邊界,所以我們需要使用字符串進行進制轉換的操作。
string divide(string s,int x){
int re=0;
for(int i=0;i<s.length();i++){
int current = re*10+s[i]-'0';
s[i]=current/x+'0';
re=current%x;//若i位置的取餘不爲0,那麼就在這個餘數乘10的基礎上加上後一位數字。
}
int pos=0;
while(s[pos]=='0'){//捨棄前面多餘的0;
pos++;
}
return s.substr(pos);//將第一個不爲0的字符串複製給s,並返回。
}
二、M進制轉換爲N進制
由於進制大於10,就需要用字符串表示,所以難點在於字符轉整數,整數轉int。
這個可以表示10進制轉換成其他進制,或者其他進制之間的轉換。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
char InttoChar(int x){
if(x<10){
return x+'0';
}else{
return x-10+'a';
}
}
int ChartoInt(char c){
if(c>='0'&&c<='9'){
return c-'0';
}else{
return c-'A'+10;
}
}
int main(){
int m,n;
cin>>m>>n;
string str;
cin>>str;
long long number = 0;
for(int i=0;i<str.size();i++){
number*=m;
number+=ChartoInt(str[i]);
}
vector<char>res;
while(number!=0){
res.push_back(InttoChar(number%n));
number/=n;
}
for(int i=res.size()-1;i>=0;i--){
cout<<res[i];
}
cout<<endl;
return 0;
}
三、兩個字符串的相加,然後進行進制的轉換
輸入A、B兩個在10進制範圍內的數字,相加後求m進制的結果,但是A+B可能會超過10進制的範圍,所以考慮用字符串來進行加法運算,其餘的和上面的m轉n進制相同。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1, s2, sum;
cin >> s1>>s2;
//較短的字符串放在第二位。
if (s1.size() < s2.size()){
string temp = s1;
s1 = s2;
s2 = temp;
}
int len = s1.size() - s2.size();
string s3(len, '0'); //較短的字符串前面補‘0’,使兩個字符串等長。
s2 = s3 + s2;
int a = 0;
for (int i = s1.size() - 1; i >= 0; i--){
int b = (s1[i] - '0') + (s2[i] - '0') + a; //字符轉化爲數字,相加和大於9則進1;
if (b > 9){
sum.push_back((b-10)+'0'); //數字轉化爲字符,存入新字符串。
a = 1;
}else{
if(b==0){
break;
}else{
sum.push_back(b+'0'); //將最後一位進爲插入新字符串。
a=0;
}
}
}
sum.push_back(a+'0');
for (string::reverse_iterator i = sum.rbegin(); i != sum.rend(); ++i) {//新字符串逆序輸出。
cout << *i;
}
return 0;
}
四、最大公約、最小公倍
#include<iostream>
#include<string>
using namespace std;
int GCD(int a,int b){
if(b==0){
return a;
}else{
return GCD(b,a%b);
}
}
int main(){
int a,b;
cin>>a>>b;
cout<<GCD(a,b)<<endl;
cout<<"最小公倍"<<a*b/GCD(a,b)<<endl;
return 0;
}
五、素數判斷、分解一個數的素數
#include<iostream>
#include<string>
using namespace std;
bool judge(int a){
if(a==1){
return false;
}
for(int i=2;i<=a/2;i++){
if(a%i==0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(judge(i)){
cout<<i<<' ';
}
}
cout<<endl;
return 0;
}
六、分解質因數,重複的因子也輸出
while (n > 1)
{
for (long i = 2; i <= n; i++)
{
if (n % i == 0)
{
n = n / i;
cout << i << " ";
break;
}
}
}
cou
七、快速冪
快速計算大次冪。如12的7次。
#include<iostream>
#include<string>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int sum=1;
while(b!=0){
if(b%2==1){
sum*=a;
}
b/=2;
a*=a;
}
cout<<sum<<endl;
return 0;
}
八、求輸入年月日距離1年1月1日所隔天數
int Getdays(int y,int m,int d)//求距離1年1月1日的距離
{
int month[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
int year=y-1;
int days=year*365+year/4-year/100+year/400;//求出包括平年閏年的天數總和
if(y%4==0&&y%100!=0||y%400==0)//若當前年爲閏年則二月加一天
month[1]=29;
for(int i=0; i<m-1; i++)
days+=month[i];
days+=d-1;
return days;
}