编程实现计算 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;
}