高精度幂的计算
来源:互联网 发布:c语言输出星号金字塔 编辑:程序博客网 时间:2024/05/16 14:32
#include <iostream>
#include<iomanip>
#include<cstring>
using namespace std;
int s;
void chen(char a[],char b[])//a=a*b //高精度乘法
{
int i,j,k,l,sum,c[410]={0};
l=strlen(a)+strlen(b);
for(i=strlen(b)-1;i>=0;i--)
for(j=strlen(a)-1,k=i+j+1;j>=0;j--,k--)
{
sum=(b[i]-'0')*(a[j]-'0')+c[k];
c[k]=sum%10;
c[k-1] += sum/10;
}
for(i=c[0] ? 0:1,j=0;i<l;i++) //结果保存在a中
a[j++]=(c[i]+'0');
a[j]=0;
}
void quw0(char a[]) //去除尾部多余的零 //初始化b
{
int i=strlen(a)-1;
while(a[i]=='0')
{a[i]=0;i--;}
}
void jilu(char a[]) //处理小数点,记录位置
{
int i,t;
for(i=0;i<strlen(a);i++) //判断有没有小数点
if(a[i]=='.') break;
if(i!=strlen(a)) //有小数点
{
for(i=strlen(a)-1,s=0;i>=1;i--)// s记录小数位数
if(a[i]!='.') s++;
else break;
if(a[i=0]=='0') // 0.0123变成123
{ for(i=2;i<strlen(a);i++)
if(a[i]!='0') {strcpy(a,&a[i]);break;}
}
else //将1.4321 变成14321
{ for(t=0,i=1;i<strlen(a)-1;i++)
{ if(a[i]=='.') t=1;
if(t) a[i]=a[i+1];
}
a[i]=0;
}
}
}
void show(char a[]) //处理结果
{ int i;
if(s>=strlen(a)) cout<<'.'<<setfill('0')<<setw(s)<<a<<endl;// 前面补零
else //不用补零,直接加入小数点输出
{for(i=0;i<strlen(a);i++)
if(strlen(a)-s==i) {cout<<'.'<<&a[i]; break;}
else cout<<a[i];
cout<<endl;
}
}
int main()
{
int n; char b[205],a[205];
while(cin>>b>>n)
{ if(n==0) {cout<<1<<endl;continue;}//将n和分为0和非0,如果是0,直接输出1
s=0; //s为记录小数点的位置,为全局变量
quw0(b);//初始化,把输入的b后面的多余的0去除
jilu(b); //讲小数化为整数,为后面的高精度乘法做准备
strcpy(a,b); //用一个新的数组a等效于b,例如b^3=b*b*b=(a*b)*b=(a‘)*b;3个b相乘,
for(int i=2;i<=n;i++) //就是实现(a*b),然后用a在保存a*b的结果
chen(a,b); //这个函数等效于a=a*b;
s*=n; //结果的小数位数
show(a); //输出结果,处理小数点
}
return 0;
}
#include<iomanip>
#include<cstring>
using namespace std;
int s;
void chen(char a[],char b[])//a=a*b //高精度乘法
{
int i,j,k,l,sum,c[410]={0};
l=strlen(a)+strlen(b);
for(i=strlen(b)-1;i>=0;i--)
for(j=strlen(a)-1,k=i+j+1;j>=0;j--,k--)
{
sum=(b[i]-'0')*(a[j]-'0')+c[k];
c[k]=sum%10;
c[k-1] += sum/10;
}
for(i=c[0] ? 0:1,j=0;i<l;i++) //结果保存在a中
a[j++]=(c[i]+'0');
a[j]=0;
}
void quw0(char a[]) //去除尾部多余的零 //初始化b
{
int i=strlen(a)-1;
while(a[i]=='0')
{a[i]=0;i--;}
}
void jilu(char a[]) //处理小数点,记录位置
{
int i,t;
for(i=0;i<strlen(a);i++) //判断有没有小数点
if(a[i]=='.') break;
if(i!=strlen(a)) //有小数点
{
for(i=strlen(a)-1,s=0;i>=1;i--)// s记录小数位数
if(a[i]!='.') s++;
else break;
if(a[i=0]=='0') // 0.0123变成123
{ for(i=2;i<strlen(a);i++)
if(a[i]!='0') {strcpy(a,&a[i]);break;}
}
else //将1.4321 变成14321
{ for(t=0,i=1;i<strlen(a)-1;i++)
{ if(a[i]=='.') t=1;
if(t) a[i]=a[i+1];
}
a[i]=0;
}
}
}
void show(char a[]) //处理结果
{ int i;
if(s>=strlen(a)) cout<<'.'<<setfill('0')<<setw(s)<<a<<endl;// 前面补零
else //不用补零,直接加入小数点输出
{for(i=0;i<strlen(a);i++)
if(strlen(a)-s==i) {cout<<'.'<<&a[i]; break;}
else cout<<a[i];
cout<<endl;
}
}
int main()
{
int n; char b[205],a[205];
while(cin>>b>>n)
{ if(n==0) {cout<<1<<endl;continue;}//将n和分为0和非0,如果是0,直接输出1
s=0; //s为记录小数点的位置,为全局变量
quw0(b);//初始化,把输入的b后面的多余的0去除
jilu(b); //讲小数化为整数,为后面的高精度乘法做准备
strcpy(a,b); //用一个新的数组a等效于b,例如b^3=b*b*b=(a*b)*b=(a‘)*b;3个b相乘,
for(int i=2;i<=n;i++) //就是实现(a*b),然后用a在保存a*b的结果
chen(a,b); //这个函数等效于a=a*b;
s*=n; //结果的小数位数
show(a); //输出结果,处理小数点
}
return 0;
}
0 0
- 高精度幂的计算
- 高精度幂的计算
- 二进制的高精度计算
- java的高精度计算
- 美丽的高精度计算
- 高精度计算(二) /*高精度的加法运算*/
- 大数,高精度计算---高精度幂次
- 8、大数,高精度计算---高精度幂次
- 高精度计算的相关题目
- 高精度计算-n的阶乘
- Poj1001!高精度幂计算!【数学】
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- poj A Bug's Life(关系并查集)
- AndroidStudio安装报错
- opencv 颜色识别
- POJ 2823 Sliding Window
- HDU 2073 JAVA
- 高精度幂的计算
- sdutacm-最短路径问题
- JAVA类型转换
- LeetCode 240. Search a 2D Matrix II
- DFS和BFS的使用
- while循环,习题33,笨办法学python
- sdutacm-C--最短路
- QDataStream类用法实例
- 李白打酒