文章目錄
- 1. 大數加法
- 2. 大數冪運算
- 3.大數求余
廢話不多說,直接上代碼了,
1. 大數加法
string getCountAdd(string a, string b)
{
string c = "";
int bit = -1; //判斷是否進位 -1為否,其他為進位數
int i = a.length()-1; //獲得a字串長度
int j = b.length()-1; //獲得b字串長度
//第一種情況 兩者都處理完
while (i != -1 && j != -1)
{
int t1 = a[i] - 48;
int t2 = b[j] - 48;
//不存在進位
if (bit == -1)
{
if (t1 + t2 >= 10)
{
int d = (t1 + t2) % 10;
c.insert(0, 1, d + 48);
bit = (t1 + t2) / 10;
}
else
{
c.insert(0, 1, t1 + t2 + 48);
}
}
//存在進位
else
{
if (t1 + t2 + bit >= 10)
{
int d = (t1 + t2 + bit) % 10;
c.insert(0, 1, d + 48);
bit = (t1 + t2 + bit) / 10;
}
else
{
c.insert(0, 1, t1 + t2 + bit + 48);
bit = -1;
}
}
i--;
j--;
}
//第二種情況 前者處理完
while (i == -1 && j != -1)
{
int t2 = b[j] - 48;
if (bit == -1)
{
c.insert(0, 1, b[j]);
}
else
{
if (t2 + bit >= 10)
{
int d = (t2 + bit) % 10;
c.insert(0, 1, d + 48);
bit = (t2 + bit) / 10;
}
else
{
c.insert(0, 1, t2 + bit + 48);
bit = - 1;
}
}
j--;
}
//第三種情況 后者處理完
while (i != -1 && j == -1)
{
int t1 = a[i] - 48;
if (bit == -1)
{
c.insert(0, 1, a[i]);
}
else
{
if (t1 + bit >= 10)
{
int d = (t1 + bit) % 10;
c.insert(0, 1, d + 48);
bit = (t1 + bit) / 10;
}
else
{
c.insert(0, 1, t1 + bit + 48);
bit = -1;
}
}
i--;
}
//最后再判斷是否存在進位
if (bit != -1)
{
c.insert(0, 1, bit + 48);
}
bit = -1;
return c;
}

2. 大數冪運算
string getCountExp(int a, int b)
{
string a1 = to_string(a);
int i = a1.length()-1;//a的最后下角標
//m位數*n位數長度不會超過m+n位
string temp = a1; //temp一直變化
string temp_2 = "0";
int bitcount = 0; //判斷當前位數
int bit = -1;//判斷是否存在進位
string * arr = new string[a1.length()];//保存每次計算的數
int arr_i = 0;
for (int x = 1; x < b; x++)//幾次方就回圈幾次
{
while (i != -1)//乘數的位數
{
//temp * a1
int t1 = a1[i] - 48;
int j = temp.length() - 1;//temp的最后下角標
for (int z = 0; z < bitcount; z++)
{
arr[arr_i].insert(0, 1, '0');
}
while (j != -1)//temp的位數
{
int t2 = temp[j] - 48;
if (bit == -1)//判斷是否有進位
{
if (t1*t2 >= 10)
{
int d = (t1*t2) % 10;
arr[arr_i].insert(0, 1, d + 48);
int d_2 = (t1*t2) / 10;
bit = d_2;
}
else
{
int d = t1*t2;
arr[arr_i].insert(0, 1, d + 48);
}
}
else
{
if ((t1*t2)+bit >= 10)
{
int d = ((t1*t2) + bit) % 10;
arr[arr_i].insert(0, 1, d + 48);
int d_2 = ((t1*t2) + bit) / 10;
bit = d_2;
}
else
{
int d = (t1*t2) + bit;
arr[arr_i].insert(0, 1, d + 48);
bit = -1;
}
}
j--;
}
if (bit != -1)
{
arr[arr_i].insert(0, 1, bit + 48);
bit = -1;
}
//走完一圈
//計算每一位的數,最后相加
//temp_2=temp_2+arr[arr_i];
temp_2 = getCountAdd(temp_2, arr[arr_i]);
bitcount++;
arr_i++;
i--;
}
bitcount = 0;
temp = temp_2;
temp_2 = "0";
//temp_2 = "0";
for (int z = 0; z < arr_i; z++)
{
arr[z] = "";
}
arr_i = 0;
i = a1.length() - 1;//a的最后下角標
}
return temp;
}

3.大數求余
int getCountMod(string a, int b)
{
int bit = -1; //判斷是否需要進位
//例如4255%5
int i = 0;
while (i < a.length())
{
int t1 = a[i] - 48;
if (bit == -1)
{
if (t1%b > 0)
{
bit = t1%b;
}
}
else
{
if (((bit * 10) + t1) % b>=0)
{
bit = ((bit * 10) + t1) % b;
}
}
i++;
}
if (bit != -1)
{
return bit;
}
else
{
return 0;
}
return 0;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272527.html
標籤:其他
上一篇:Python 編程1000例(18):查找演算法——分塊查找演算法
下一篇:堆疊的創建(基礎)
