杭电 1230 火星a+b 【大数】【进制转换】

来源:互联网 发布:linux kill -9用法 编辑:程序博客网 时间:2024/04/26 14:08
<pre name="code" class="objc">#include<stdio.h>//自己打的#include<math.h>#include<string.h>int ss(int n)//学长加的打表= ={    int i;    for(i=2;i<=sqrt(n);i++){        if(n%i==0)            return 0;    }    return 1;}int main(){    int a[105],b[105],c[105],num1,num2,i,l1,l2;    char str1[1000],str2[1000];    //int f[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};    int f[1000];    int z=0;    for(i=2;i<1000;i++)    {//学长加的打表= =        if(ss(i)==1)            f[z++]=i;    }    while(EOF!=scanf("%s%s",str1,str2)&&(strcmp(str1,"0")!=0&&strcmp(str2,"0")!=0))    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        num1=0;num2=0;        l1=strlen(str1);l2=strlen(str2);        for(i=0;i<l1;i++)        {            if(str1[i]>='0'&&str1[i]<='9')            {                a[num1]*=10;                a[num1]+=str1[i]-'0';            }            else                num1++;        }        for(i=num1;i>=0;i--)            c[i]=a[num1-i];        for(i=0;i<l2;i++)        {            if(str2[i]>='0'&&str2[i]<='9')                {                b[num2]*=10;                b[num2]+=str2[i]-'0';            }            else if(str2[i]==',')                num2++;        }        for(i=num2;i>=0;i--)                c[i]+=b[num2-i];        num1=num1>num2?num1:num2;        for(i=0;i<=num1;i++)        {            if(c[i]>=f[i])            {                c[i]=c[i]%f[i];                c[i+1]+=1;            }        }        if(c[num1+1]!=0)            num1++;        for(i=num1;i>=0;i--)        {            printf("%d",c[i]);            if(i)  printf(",");        }        printf("\n");    }    return 0;}


<pre name="code" class="objc"><pre name="code" class="objc">#include<stdio.h>  //使用输入输出函数  #include<string.h>  //使用字符串函数  int prim[50];  //存储素数列表  int p[250];  //用于筛选素数处理  void makeprime()  //筛选法求素数  {      int i,j;      memset(p,0,sizeof(p));  //初始化数组      for(i=2;i<125;i++)   //筛选法求素数          for(j=i+i;j<250;j+=i)              p[j]=1;      for(i=2,j=0;i<250&&j<50;i++)  //形成素数列表          if(!p[i])              prim[j++]=i;  }  int main()  {      char x[1000],y[1000],*p;  //输入数组,存储原始数据、指针      int a[50],b[50],t; //处理数组,中间变量      int len,lena,lenb;//记录长度      int i,j;  //循环变量        makeprime();//产生素数数组        while(scanf("%s%s",x,y)&&x[0]!='0'||y[0]!='0')  //初始化      {          //初始化处理数组          memset(a,0,sizeof(a));          memset(b,0,sizeof(b));          //处理第一个“火星数”          lena=0;          p=x;          while(strstr(p,","))//提取数字          {              sscanf(p,"%d",&a[lena++]);              p=strstr(p,",")+1;          }          sscanf(p,"%d",&a[lena]);          for(j=0;j<=lena/2;j++)//数字逆序处理[低位放前面,高位放后面,利于进位处理]          {              t=a[j];              a[j]=a[lena-j];              a[lena-j]=t;          }          //同上          lenb=0;          p=y;          while(strstr(p,","))          {              sscanf(p,"%d",&b[lenb++]);              p=strstr(p,",")+1;          }          sscanf(p,"%d",&b[lenb]);          for(j=0;j<=lenb/2;j++)          {              t=b[j];              b[j]=b[lenb-j];              b[lenb-j]=t;          }          //检测输出          /*printf("---------a---------\n");         for(i=0;i<=lena;i++)printf("%d ",a[i]);         printf("\n\n");         printf("---------b---------\n");         for(i=0;i<=lenb;i++)printf("%d ",b[i]);         printf("\n\n");*/          //加法处理,进位处理          len=lena>lenb?lena:lenb;//提取最大长度          for(i=0;i<=len;i++)          {              a[i]+=b[i];  //加法处理              if(a[i]>=prim[i])  //进位处理                  a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i];          }          if(a[i]>=prim[i])  //假设最高位需要进位              a[i+1]+=a[i]/prim[i],a[i]=a[i]%prim[i];            if(a[i])len++; //若最高位进位,总体长度加一          //输出答案【中间用逗号隔开,最后要换行】          //printf("ans=");          printf("%d",a[len]);          for(i=len-1;i>=0;i--)printf(",%d",a[i]);          printf("\n");      }      return 0;  }  







0 0
原创粉丝点击