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;
}
- Exe 3 —— n^n幂和 (长整数的乘法和加法,以及对于字符数组和字符串的理解)
- 大整数的加法、减法和乘法
- 大整数的加法和乘法运算
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 关于大整数乘法和加法的一些整理
- 分数的加法和乘法
- 多项式的加法和乘法
- 矩阵的加法和乘法
- string字符串操作以及整数和字符转换的总结
- 【1445】求n个整数的和
- 从键盘中输入一个整数n,求1-n的和,以及偶数和、奇数和
- 字符串实现加法和乘法
- 字符串截取以及字符数组和字符指针的区别
- 包含n个整数的数组,返回该数组和为最大的子数组
- 求助高手,帮忙编一个只用加法和单循环,计算出不超过n的三次方根的整数的算法。谢谢!!
- 任意长度的高精度大整数和浮点数的加法和乘法
- 大整数加法和乘法STL
- 对于数组和指针的理解
- ccproxy受瑞星杀毒软件影响
- I think she is an angel, I believe it!
- 程序实现调用迅雷(以C#为例)
- "超时时间已到。在操作完成之前超时时间已过或服务器未响应"的解决方法
- Linux使用窍门技巧15则
- Exe 3 —— n^n幂和 (长整数的乘法和加法,以及对于字符数组和字符串的理解)
- 浅谈malloc与 kmalloc、cmalloc、realloc、new 的区别
- Microsoft Visual C++ 6.0 各类工程配置说明(一)
- 基于s3c2440 的解决方案
- 浅析网络编程之Socket模型(上)
- ms agent
- 浅析网络编程之Socket模型(下)
- NET设计模式(2):单件模式(Singleton Pattern)
- 同步/异步与阻塞/非阻塞的区别