求n的n次幂和: 1^1+2^2+3^3+……+n^n

时间:2021-01-28 15:11:50

编程实现计算 1^1+2^2+3^3+……+n^n,其中n为用户输入的任意整数。(提示:要考虑结果可能超出长整数long的表示范围的情况) 

 

注意:本方法中采用整形数组元素存放大数的每一位

 

 

=================================

 

#include <iostream>
using namespace std;

const int N = 10000;  //定义能够存放的最大位数,可以根据需要改变

 

/*大数加法:最终的结果放在sum数组,result数组存放k^k的值序列

这里的大数在数组中存放的规则是:大数的低位存放在下标较小的数组元素中读取的时候采用倒着读,即先读最较高位的,最后读下标为零的元素*/


void BigAdd(int *sum,int &height_sum,int *result,int &height_res)
{
 int i,j;
 int tempsum;
 int carry = 0;
 for(i=0,j=0;i<height_sum,j<height_res;i++,j++)
 {
  tempsum = sum[i]+result[j]+carry;
  sum[i] = tempsum%10;
  carry = tempsum/10;
 }
 while(carry)
 {
  tempsum = sum[i]+carry ;
  sum[i] = tempsum%10;
  carry = tempsum/10;
  i++;
 } 
 height_sum = i;
}

 

void n_nAnd(int n)
{
 int sum[N] = {0};     //最终的结果
 sum[0] = 1;              //使得最低位为1
 int height_sum = 1;  //和的位数
 int height_res;

 //求n-1次和
 for(int k=1;k<=n;k++)
 {
  int result[N];    //存放每次幂的结果
  result[0] = 1;
  height_res = 1;   //k^k的位数
  //计算k^k
  for(int i=1;i<=k;i++) 
  {
   int res = 0;
   for(int j=0;j<height_res;j++)
   {
    int buf = result[j]*k+res;
    result[j] = buf%10;
    res = buf/10;
   }
   while(res)
   {
    result[height_res++] = res%10;
    res /= 10;
   }

  }
  if(k>1 && k<=n)
   BigAdd(sum,height_sum,result,height_res);
 }
 //输出结果
 int i;
 for(i=N-1;i>=0;i--)
  if(sum[i]!=0)
   break;
 for(int k=i;k>=0;k--)
  cout<<sum[k];
 cout<<endl<<" 总长度是:"<<i+1<<endl;
}


int main()
{
 int n;
 char ch = 'y';
 while('y'==ch)
 {
  cout<<"Input a number:";
  cin>>n;
  if(n>10000 || n<0)
   cout<<"输入了不合法的数字!";
  else
   n_nAnd(n);
  cout<<"continue? (y/n):";
  cin>>ch;
 }
 return 1;
}