高精度小结/。。。

很早就开始写高精度的加法了 今天来总结一下吧
首先 我用的是字符数组处理的方法 先用字符数组输入 在逆序转入int型的数组 然后进位计算就好了
需要注意的几个细节 1.记得每次循环都需要初始化


#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
 if(x>y)
 return x;
 else
 return y;
}
int main()
{
 char a[1010],b[1010];
 int x[1010],y[1010];
 int t,c[1010];
 int i,j,n,add,ret,get;
 int sum,casee=0;
 scanf("%d",&t);
 while(t--)
 {
  memset(x,0,sizeof(x)); //初始化
  memset(y,0,sizeof(y));
  memset(c,0,sizeof(c));
  scanf("%s %s",&a,&b);
  printf("Case %d:\n",++casee);
  j=strlen(a);
  n=0;
  for(i=j-1;i>=0;i--)
  {
   x[n++]=a[i]-'0';
  }
  j=strlen(b);
  n=0;
  for(i=j-1;i>=0;i--)
  {
   y[n++]=b[i]-'0';
  }
  add=0;
  for(i=0;i<=max(strlen(a),strlen(b))+3;i++)//逆序
  {
   sum=x[i]+y[i]+add;
   add=sum/10;
   c[i]=sum%10;
  }
  ret=0;
  for(i=0;i<=max(strlen(a),strlen(b))+3;i++)
  {
    if(c[i]!=0)
    {
             ret=1;
             break;
    } 
  }
  printf("%s + %s = ",&a,&b);
  if(ret==0)
  printf("0");
  else
  {
      for(i=max(strlen(a),strlen(b))+3;i>=0;i--)
      {
       if(c[i]!=0)
       {
        get=i;
        break;
       }
      }
      for(i=get;i>=0;i--)
      {
       printf("%d",c[i]);
      }
  }
  if(t!=0)
  printf("\n\n");
  else
  printf("\n");
 }
}1002
还有就是对于数组的中大数的计算
关键点 怎么去处理逆序问题 (oj1297上的大神是直接把初始的值放在最后一位) 其他的思路就和普通的大数加法是一样的了
(!! 对逆序的处理是关键 以后也要灵活处理 )  逆序是位对齐的一种方式 位对齐在大数乘法 含小数的大数加法中另有体现
附上代码

#include<iostream>

#include<string.h>
#include<stdio.h>
using namespace std;
int f[1005][1201];
int main()
{
 
 int i,j,add,sum;
 memset(f,0,sizeof(f));
 f[1][1200]=1;
 f[2][1200]=2;
 f[3][1200]=4;
 f[4][1200]=7;
 //printf("111\n");
 for(i=5;i<=1000;i++)
 {
  add=0;
  for(j=1200;j>=0;j--)
  {
   sum=f[i-1][j]+f[i-2][j]+f[i-4][j]+add;
   add=sum/10;
   f[i][j]=sum%10;
  }
 
 }
 int n;
 while(scanf("%d",&n)>0)
 {
  for(j=0;j<=1200;j++)
   if(f[n][j]!=0)
    break;
   for(;j<=1200;j++)
  printf("%d",f[n][j]);
   printf("\n");
 }
 return 0;
}

posted @ 2016-03-13 21:13  猪突猛进!!!  阅读(517)  评论(0编辑  收藏  举报