Exe 3 —— n^n幂和 (长整数的乘法和加法,以及对于字符数组和字符串的理解)

来源:互联网 发布:mac重新安装系统教程 编辑:程序博客网 时间:2024/06/09 20:14

注意:char tempA[20] = {'/0'};  tempA实际的长度是0。

char* a={'/0'} ; a的长度也是0,但是这样声明以后,就不能再*(a+i)这样逐个赋值了

                        字符串=字符数组+'/0'

 

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define N 3000
int res[N];

/*****
* Function: 
* 参数:
* a: 乘数
* b: 乘数
* n: a的长度
* m: b的长度
* 没有返回值,结果直接放到全局变量res数组中,如果不想要全局变量,也可以在函数中多加一个参数,保存结果。
*****/

//长整数乘法
int Multiply(char *a,char *b,int n,int m) 
{
    int i,j,carry,t,tt;
    int num=0;
    memset(res,0,sizeof(res));
    for(i=0;i<m;i++)
    {
        carry=0;    //进位
        for(j=0;j<n;j++)
        {   
            t=(a[n-1-j]-'0')*(b[m-1-i]-'0')+carry;
            if(0 == t)   
                continue;               
            num = j+i;       
            tt = res[num]+(t);   
            res[num] = tt%10;    
            carry = tt/10;
        }
        if( carry > 0 )
        {
            res[++num] += carry;
        }
    }
 return num; //返回长度值减去1
}


//将整形数组转化为字符型数组
void itransfera(int res[],int num,char temp[])
{
 for(int i=0;i<=num;i++)
 {
  temp[i]=res[num-i]+'0';
 }
}

void Print(int num)
{
 for(int i=num;i>=0;i--)
  cout<<res[i];
 cout<<endl;
}


//n^n的求值函数
int n_nmi(int n)
{
 char a[N]={0};
 itoa(n,a,10);
 int len1 = strlen(a);
 char resp[N],temp[N] = {0};
 strcpy(resp,a);    //将20复制到resp
 int len2 = 0;
 int num = 0;
 for(int i=0;i<n-1;i++)
 {
  if(i==0)      //第一次
  {
   len2 = strlen(resp);
   num = Multiply(a,resp,len1,len2);
   itransfera(res,num,temp);   // 将res逆置并存在一个字符数组中
  }
  else
  {
   len2 = strlen(temp);
   num = Multiply(a,temp,len1,len2);
   itransfera(res,num,temp); 
  }
 }
    return num;


//长整型的求和
char* BigAdd(char* a,char* b)
{
 int i = strlen(a)-1;
 int j = strlen(b)-1;
 int maxlen = strlen(a)>=strlen(b)? (strlen(a)+1) : (strlen(b)+1);
 char* result = new char[maxlen+1]; //分配结果的内存空间
 result[maxlen] = '/0';   //字符数组存放字符串,最后一位为'/0'
 int carry = 0;
 int k = strlen(result)-1;
 while(i>=0 && j>=0)
 {
  result[k] = (a[i]-'0'+b[j]-'0'+carry)%10+'0';
  carry = (a[i]-'0'+b[j]-'0'+carry)/10;
  --i;
  --j;
  --k;
 }
 while(i>=0)
 {
  result[k] = (a[i]-'0'+carry)%10+'0';
  carry = (a[i]-'0'+carry)/10;
  --k;
  --i;
 }
 while(j>=0)
 {
  result[k] = (b[j]-'0'+carry)%10+'0';
  carry = (b[j]-'0'+carry)/10;
  --j;
  --k;
 }
 result[0] = carry+'0';
 if(result[0]!='0')
  return result;
 else
  return result+1;
}

 

int main()
{
 int n;
 int num = 0;
 char *result = "1";    //用于存放幂和
 char tempA[N] = {'/0'}; //将整型res[N]的中间变量值转化为char型的临时数组
 cout<<"本程序是计算n^n幂和的函数,请输入您想计算的参数n:";
 cin>>n;
 for(int i=1;i<=n;i++)
 {
     num = n_nmi(i);
  for(int j=0;j<=num;j++)
  {
   tempA[j] = res[num-j]+'0';
  }
  result = BigAdd(tempA,result);
 }
 cout<<result<<endl;
 return 0;
}

原创粉丝点击