高精度求幂运算

这个程序实现了高精度的幂运算,通过字符串处理来进行大数乘法和指数计算。核心函数包括`multiply`用于两个字符串表示的大数相乘,`exponentiation`用于将一个字符串表示的数进行指数运算,以及`result`来处理结果的格式化。程序能够处理包含小数点的输入,并确保结果正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdlib.h>
#include<stdio.h>
#include <string.h>

void multiply(char *a,char *s)
{
 int i,j;
 int d[130]={0};
 char res[130]={0};
 for(i=0;i<strlen(a);i++)//a 的下标()
  for(j=0;j<strlen(s);j++)//s的下标
   if(i+j<(strlen(s)+strlen(a)))
   {
    d[i+j]+=(a[i]-'0')*(s[j]-'0');
   }
   int inc=0;
   for(i=(strlen(s)+strlen(a))-2;i>=0;i--){
    if(d[i]>9)
    { 
     if(i==0)
      inc=d[i]/10;
     else
      d[i-1]+=d[i]/10;
     d[i]=d[i]%10;
    }

    res[i]=d[i]+'0';
   }
   memset(s,0,sizeof(s));

   if(inc!=0) 
   {
    sprintf(s,"%d",inc);
   }
   strcat(s,res);

}


void exponentiation(char* str,int n)
{
 char tmp[130]={0};
 strcpy(tmp,str);
 int i=0;
 for(i=0;i<n-1;i++)
 {
  multiply(tmp,str); 
 }
}
void result(char* str1,int len,int n )
{
 char res[130]={0};
 if(strlen(str1)>len*n)
 {
  strncpy(res,str1,strlen(str1)-len*n);
  strcat(res,".");
  strcat(res,&str1[strlen(str1)-len*n]);
 }
 else
 {
  res[0]='.';
  for(int i=0;i<len*n-strlen(str1);i++)
   res[i+1]='0';

  strcat(res,str1);
 }
 int i=0;
 for( i=strlen(res)-1;(i>0)&&(res[i]=='0');i--)
 {
  res[i]=0; 
 }
 if(res[i]=='.') res[i]=0;
 strcpy(str1,res);

}
int main()
{
 char s[7]={0};int n=0;
 while(scanf("%s%d",s,&n)!=EOF)
 {
  int i=0;
  int len_str1=0,len_str2=0;

  char str1[130]={0};char str2[130]={0};


  int cnt=0;
  int isInteger=1;
  for( i=0 ;i<strlen(s);i++)
   if(s[i]=='.')
   {
    isInteger=0;
    cnt=i;
   }
   if(!isInteger)//如果存在小数点
   {
    memcpy(str1,s,cnt*sizeof(char));//小数点左边的整数部分复制给str1

    if(atoi(str1)==0)
    {
     // printf("整数部分为0\n");
     len_str1=0;
     len_str2=strlen(s)-strlen(str1)-1;
     memset(str1,0,sizeof(str1));//
     memcpy(str1,&s[cnt+1],(strlen(s)-cnt)*sizeof(char)-1);//整数部分为0,将小数点右面的小数部分复制给str1
    }
    else{//小数点左边的整数部分已经复制给str1
     // printf("整数部分不为0\n");
     memset(str2,0,sizeof(str2));
     memcpy(str2,&s[cnt+1],(strlen(s)-cnt)*sizeof(char)-1);
     if(atoi(str2)==0) 
     {
      //printf("整数部分不为0,小数部分为0,str1不需要加小数部分\n");
     }
     else
     {
      //printf("整数部分不为0,小数部分不为0\n");
      len_str1=strlen(str1);
      len_str2=strlen(str2);
      strcat(str1,str2);
     }
   }
    exponentiation(str1,n);
    result(str1,len_str2,n);
   }
   else//如果不存在小数点
   {

    if((!strcmp(str1,"1"))||n==0)
    {
     printf("1\n");
     continue;
    }
    strcpy(str1,s);
    exponentiation(str1,n);
   }
   printf("%s\n",str1);
 }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值