大整数的求幂 c++程序

#include <iostream>
using namespace std;
#include <string>
#include <ctime>


string add(string a, string b)//算两个字符串的加法,如“123456” + “111111” = “234567”;
{
 if(a == "")
  return b;
 else if(b == "")
  return a;

 if(a.length() < b.length())
 {
  string temp = a;
  a = b;
  b = temp;
 }

 string answer(100000, '0');//这个字符串的长度决定了结果的长度,也就是说输出的结果不能超过100000位。
 
 int input = 0, i = 1, lengtha = a.length(), lengthb = b.length();

 answer[0] = 's';

 while(lengthb)
 {
  answer[i] = (a[--lengtha] + b[--lengthb] - 96 + input) % 10 + 48;
  input = (a[lengtha] + b[lengthb] - 96 + input) >= 10 ? 1 : 0;
  
  i++;
 }


 int te = lengtha ;
 if(lengtha > 0)
 {
  while(true)
  {
   a[--lengtha] += input;

   input = 0;
   if(a[lengtha] > '9')
   {
    a[lengtha] = '0';
    input = 1;
   }

   if(lengtha  < 1)
   {
    if(input == 1)
    {
     a = '1' + a ;
     te++;
    }
    break;
   }
  }
 
  while(te)
   answer[i++] = a[--te];

 }
 else if(input == 1)
  answer[i++] = '1';
  
 
 answer[i] = 's';

 int t = answer.find('s', 1) - 1, t1 = 0;
 char tt;
 
 string s  = answer.substr(1, t );
 t--;
    while(t1 <= t/2 )
 {
  tt = s[t1];
  s[t1] = s[t - t1];
  s[t - t1] = tt;
 
  t1++;
 }

 return s;

}


string multiplication(string a)//算字符串的平方,如“123456”的平方为“15241383936”;
{
 string answer = "";

 long in = 0, temp = 0;
 int flagl = a.length() - 1, flagr = flagl, times = 2 * flagl + 1, i = 0;

 

 while(times--)
 {
  while(2 * i < flagr - flagl)
  {
   temp += (a[flagl + i] - 48) * (a[flagr - i] - 48);
   i++;
  }

  temp = 2 * temp + in;
  if(2 * i == flagr - flagl)
   temp += (a[flagl + i] - 48) * (a[flagl + i] - 48);

  answer += temp % 10 + 48;
  in = temp / 10;

  flagl = --flagl < 0 ? flagr--, 0 : flagl;
  temp = i = 0;
 }

 if(in > 0)
  while(in)
  {
   answer += in % 10 + 48;
   in /= 10;
  }

 int t1 = 0, t2 = answer.length() - 1, t3 = t2 / 2;
 char tt;
    while(t1 <= t3 )
 {
  tt = answer[t1];
  answer[t1] = answer[t2 - t1];
  answer[t2 - t1] = tt;

  t1++;
 }

 return answer;

}

 

string amas(string a, char b)//算字符串与一个字符的乘积,如“1234”乘 “2”为“2468”;
{
 string answer;

 if(b == '0') return "0";

 int b1 = b - 48, length = a.length() - 1, in = 0, in1;
 char temp;

 while(length > -1)
 {
  in1 = ( a[length] - 48 ) * b1 + in;
  in = in1 / 10;
  temp = in1 % 10 + 48;

  answer += temp;

  length--;
 }

 if(in > 0)
  answer += in + 48;

 int t = answer.length() - 1, t1 = 0;
 char tt;

    while(t1 <= t/2 )
 {
  tt = answer[t1];
  answer[t1] = answer[t - t1];
  answer[t - t1] = tt;
 
  t1++;
 }


 return answer;
}


string amass(string a, string b)//算两个字符串的乘积,求平方时没multiplication的快;
{
 if(a == "")
  return b;
 else if(b == "")
  return a;

 int lengthb = b.length();
 string answer1 = "";

 while(lengthb--)
 {
  answer1 = add(amas(a, b[lengthb]), answer1);

        a += '0';
 }


 return answer1;
}

 


string mi(string a, int n)

 if(n == 0 || a == "1")
  return "1";

 if(n == 1)
  return a;

 if(n == 2)
  return multiplication(a);

 if(n % 2 == 0)
  return mi(multiplication(a), n/2);
 else
  return amass(mi(multiplication(a), n/2), a);

}


int main(void)
{
 int totalnum;
 string a, aa;
 int n;

    cout << "输入底数:";
 cin >> a;
 cout << "输入幂数:";
 cin >> n;

 if(a[0] == '-')
 {
  a = a.substr(1, a.length() - 1);

  if(n % 2 == 1)
   aa = "-";
  else
   aa = "";
 }
 else
  aa = "";


 clock_t t1, t2;
 t1 = clock();


 cout << endl << "结果为:"<< aa <<  mi(a, n) << endl;
 


 t2 = clock();
 cout <<  "花费时间为::"<< (double)(t2 - t1)/1000 <<"秒!"<< endl;


 return 0;


}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值