| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 634 人关注过本帖
标题:写了个超大数求余的程序, 不过程序感觉很烦琐
只看楼主 加入收藏
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
结帖率:100%
收藏
 问题点数:0 回复次数:3 
写了个超大数求余的程序, 不过程序感觉很烦琐
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
char str[9][MAX+1];

void rollback(char array[],int Len)
{
 char temp;
 for(int i=0;i<Len/2;i++)
    temp=array[i],array[i]=array[Len-i-1],array[Len-i-1]=temp;
}

void calculate(char str[],int i,int sLen2)
{
 int j,t=0,m=sLen2;
 for(j=0;j<sLen2;++j)
    {
     str[j]=(str[j]-48)*(i+1)+48;
     str[j]+=t;
     t=0;
     if(str[j]>'9')
       {
        if(str[j+1]=='\0')
          {
           str[j+1]=(str[j]-48)/10+48;
           str[j]=(str[j]-48)%10+48;
           str[j+2]='\0';
           m++;
          }
          else {
                t=(str[j]-48)/10;
                str[j]=(str[j]-48)%10+48;
               }
       }
    }
 rollback(str,m);
}   
   
int main()
{
 char str1[MAX],str2[MAX],str3[MAX],temp[MAX];
 int sLen1,sLen2,i,flag=0;
 gets(str1);gets(str2);
 strcpy(str3,str1);
 sLen1=strlen(str1);
 sLen2=strlen(str2);
 if(sLen1<sLen2)
   {printf("%s %% %s is %s\n",str3,str2,str1);system("pause");return 0;}
 if((sLen1==sLen2)&&strcmp(str1,str2)<0)
   {printf("%s %% %s is %s\n",str3,str2,str1);system("pause");return 0;}
 int j,Len,m;
 strcpy(str[0],str2);
 for(i=1;i<9;++i)
    {
     strcpy(str[i],str2);
     rollback(str[i],sLen2);
     calculate(str[i],i,sLen2);
    }
 for(;sLen1>=sLen2;)
    {
     if((sLen1==sLen2)&&strcmp(str1,str2)<0) break;
     for(i=0;i<9;++i)
        {
         Len=strlen(str[i]);
         for(j=0;j<Len;++j)
            temp[j]=str1[j];
         temp[j]='\0';
         if(strcmp(temp,str[i])>=0)
           break;
        }
     if(i==9)
       {
        for(i=0;strlen(str[i])!=Len;++i);
        --i;
        for(j=0;j<Len;++j)
            temp[j]=str1[j];
        temp[j]='\0';
        for(m=Len-1;m>0;--m)
           str[i][m]=str[i][m-1];
        str[i][0]='0';
        str[i][Len]='\0';
       }
     if(strcmp(temp,str[i])==0)
       {
        sLen1-=Len;
        for(j=Len;str1[j]!='\0';++j)
           str1[j-Len]=str1[j];
        str1[j-Len]='\0';
       }
       else
           {
            for(j=Len-1;j>=0;--j)
               {
                str1[j]=str1[j]-str[i][j]+48;
                if(str1[j]<48)
                   {
                    str1[j]+=10;
                    --str1[j-1];
                   }
               }
            char *p=str1;
            for(;*p=='0';++p,sLen1--);
            for(m=0;*p!='\0';++p)
               str1[m++]=*p;
            str1[m]='\0';
            if(*str[i]=='0')
              {
               for(m=0;m<Len;++m)
                  str[i][m]=str[i][m+1];
               str[i][m]='\0';
              }
           }
     }
 if(*str1=='\0') printf("%s %% %s is 0\n",str3,str2);
   else printf("%s %% %s is %s\n",str3,str2,str1);         
 system("pause");
 return 0;      
}
搜索更多相关主题的帖子: 感觉 
2009-08-09 21:46
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
你这玩意能测多少的?

1111111111111111111111111111111111111111111111111111%9=?

生命不熄,战斗不止.
2009-08-09 22:01
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
以下是引用wxjeacen在2009-8-9 22:01的发言:你这玩意能测多少的?1111111111111111111111111111111111111111111111111111%9=?
还是你细心,char=9*9+48=129  越界了....修改了一下,可以了,帮我验证.这个改MAX就可以,我定的是1000位,改MAX就可以...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
char str[9][MAX+1];

void rollback(char array[],int Len)
{
 char temp;
 for(int i=0;i<Len/2;i++)
    temp=array[i],array[i]=array[Len-i-1],array[Len-i-1]=temp;
}

void calculate(char str[],int i,int sLen2)
{
 int j,t=0,m=sLen2,temp;
 for(j=0;j<sLen2;++j)
    {
     temp=(str[j]-48)*(i+1)+48;
     temp+=t;
     t=0;
     if(temp>9)
       {
        if(str[j+1]=='\0')
          {
           str[j+1]=(temp-48)/10+48;
           str[j]=(temp-48)%10+48;
           str[j+2]='\0';
           m++;
          }
          else {
                t=(temp-48)/10;
                str[j]=(temp-48)%10+48;
               }
       }
    }
 rollback(str,m);
}   
   
int main()
{
 char str1[MAX],str2[MAX],str3[MAX],temp[MAX];
 int sLen1,sLen2,i,flag=0;
 gets(str1);gets(str2);
 strcpy(str3,str1);
 sLen1=strlen(str1);
 sLen2=strlen(str2);
 if(sLen1<sLen2)
   {printf("%s %% %s is %s\n",str3,str2,str1);system("pause");return 0;}
 if((sLen1==sLen2)&&strcmp(str1,str2)<0)
   {printf("%s %% %s is %s\n",str3,str2,str1);system("pause");return 0;}
 int j,Len,m;
 strcpy(str[0],str2);
 for(i=1;i<9;++i)
    {
     strcpy(str[i],str2);
     rollback(str[i],sLen2);
     calculate(str[i],i,sLen2);
    }
 for(;sLen1>=sLen2;)
    {
     if((sLen1==sLen2)&&strcmp(str1,str2)<0) break;
     for(i=0;i<9;++i)
        {
         Len=strlen(str[i]);
         for(j=0;j<Len;++j)
            temp[j]=str1[j];
         temp[j]='\0';
         if(strcmp(temp,str[i])>=0)
           break;
        }
     if(i==9)
       {
        for(i=0;strlen(str[i])!=Len;++i);
        --i;
        for(j=0;j<Len;++j)
            temp[j]=str1[j];
        temp[j]='\0';
        for(m=Len-1;m>0;--m)
           str[i][m]=str[i][m-1];
        str[i][0]='0';
        str[i][Len]='\0';
       }
     if(strcmp(temp,str[i])==0)
       {
        sLen1-=Len;
        for(j=Len;str1[j]!='\0';++j)
           str1[j-Len]=str1[j];
        str1[j-Len]='\0';
       }
       else
           {
            for(j=Len-1;j>=0;--j)
               {
                str1[j]=str1[j]-str[i][j]+48;
                if(str1[j]<48)
                   {
                    str1[j]+=10;
                    --str1[j-1];
                   }
               }
            char *p=str1;
            for(;*p=='0';++p,sLen1--);
            for(m=0;*p!='\0';++p)
               str1[m++]=*p;
            str1[m]='\0';
            if(*str[i]=='0')
              {
               for(m=0;m<Len;++m)
                  str[i][m]=str[i][m+1];
               str[i][m]='\0';
              }
           }
     }
 if(*str1=='\0') printf("%s %% %s is 0\n",str3,str2);
   else printf("%s %% %s is %s\n",str3,str2,str1);         
 system("pause");
 return 0;      
}

[ 本帖最后由 godbless 于 2009-8-9 23:00 编辑 ]
2009-08-09 22:59
piggydog
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-1-22
收藏
得分:0 
2013-02-05 15:07
快速回复:写了个超大数求余的程序, 不过程序感觉很烦琐
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022111 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved