codevs 3115,3116,3117。

主要是对于高精度的练习,还不会的同学可以学习下。

//加法
#include<stdio.h>
#include<string.h>
struct hp
{
  int w[260];
};
hp jia(hp a,hp b)
{
  hp c;
  c.w[0]=a.w[0]>b.w[0]?a.w[0]+1:b.w[0]+1;
  for (int i=1;i<=c.w[0];i++) c.w[i]=0;
  for (int i=1;i<=c.w[0]-1;i++)
  {
   c.w[i]+=a.w[i]+b.w[i];
   c.w[i+1]+=c.w[i]/10;
   c.w[i]%=10;
  }
  while (c.w[0]>1&&c.w[c.w[0]]==0) c.w[0]--;
  return c;
}
hp a,b,c;
char s[260];
int main()
{
  int len;
  scanf("%s",s);  
  len=strlen(s);
  a.w[0]=len; //把第一个数存为高精度
  for (int i=1;i<=len;i++) a.w[i]=s[len-i]-'0'; 
  scanf("%s",s);  
  len=strlen(s);
  b.w[0]=len; //把第二个数存为高精度
  for (int i=1;i<=len;i++) b.w[i]=s[len-i]-'0'; 
  c=jia(a,b);
  for (int i=c.w[0];i>=1;i--)
   printf("%d",c.w[i]);
  printf("\n");
  return 0;
}
//乘法
#include<stdio.h>
#include<string.h>
struct hp
{
    int w[260];
};
hp a,b,c;
void cheng(hp a,hp b)
{
    c.w[0]=a.w[0]+b.w[0];
     for(int i=1;i<=a.w[0];i++)
      for(int j=1;j<=b.w[0];j++)
      {
          c.w[i+j-1]+=a.w[i]*b.w[j];
          c.w[i+j]+=c.w[i+j-1]/10;
          c.w[i+j-1]%=10;
      }
      while(c.w[0]>1&&c.w[c.w[0]]==0)  c.w[0]--;
}
int main()
{
    char s1[260],s2[260];
    scanf("%s%s",s1,s2);
    a.w[0]=strlen(s1);
    for(int i=1;i<=a.w[0];i++)
      a.w[i]=s1[a.w[0]-i]-'0';
    b.w[0]=strlen(s2);
    for(int i=1;i<=b.w[0];i++)
       b.w[i]=s2[b.w[0]-i]-'0';
    cheng(a,b);
    for(int i=c.w[0];i>=1;i--)
     printf("%d",c.w[i]);
    return 0;
}

高精度是基础,学会后还可以做一些其他的题目进行练习。