PAT 大数运算

来源:互联网 发布:ubuntu iptables启用 编辑:程序博客网 时间:2024/05/01 18:46
PAT中关于大数的有B1017,A1023,A1024 (A-Advance,B-Basic)

B1017

1017. A除以B (20)

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式:

在1行中依次输出Q和R,中间以1空格分隔。

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N=1010; 5 struct bignum{ 6     int d[N]; 7     int len; 8     bignum(){ 9         memset(d,0,sizeof(d));10         len=0;11     }12 };13 bignum change(char str[]){14     bignum res;15     res.len=strlen(str);16     for(int i=0;i<res.len;i++)17         res.d[i]=str[res.len-1-i]-'0';18     return res;19 }20 bignum divide(bignum a,int b,int &r){21     bignum res;22     res.len=a.len;23     for(int i=res.len-1;i>=0;i--){24         r=r*10+a.d[i];25         if(r<b)26             res.d[i]=0;27         else{28             res.d[i]=r/b;29             r%=b;30         }31     }32     while(res.len>1 && res.d[res.len-1]==0)33         res.len--;34     return res;35 }36 void printbign(bignum t){37     for(int i=t.len-1;i>=0;i--)38         printf("%d",t.d[i]);39 }40 int main()41 {42     char A[N];43     int B;44     while(scanf("%s%d",A,&B)!=EOF){45         bignum a,q;46         int r=0;47         a=change(A);48         q=divide(a,B,r);49         printbign(q);50         printf(" %d\n",r);        51     }52     return 0;53 }
View Code

 

A1023. Have Fun with Numbers (20)

http://www.patest.cn/contests/pat-a-practise/1023

 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 struct bignum{ 6     int d[21]; 7     int len; 8     bignum(){ 9         memset(d,0,sizeof(d));10         len=0;11     }12 };13 int account[10];// 统计origin中1~9各个数字出现次数 14 char origin[21];15 bignum str_to_bign(char str[]){16     bignum res;17     res.len=strlen(str);18     memset(account,0,sizeof(account));19     for(int i=0;i<res.len;i++){20         res.d[i]=str[res.len-i-1]-'0';21         account[res.d[i]]++;        22     }23     return res;24 }25 bignum multi(bignum a,int b){26     bignum res;27     int carray=0;28     for(int i=0;i<a.len;i++){29         int temp=a.d[i]*b+carray;30         res.d[res.len++]=temp%10;31         carray=temp/10;32     }33     while(carray!=0){34         res.d[res.len++]=carray%10;35         carray/=10;36     }37     return res;38 }39 bool isNumber(bignum a){40     if(a.len!=strlen(origin))41         return false;42     int num[10]={0};43     for(int i=0;i<a.len;i++)44         num[a.d[i]]++;45     for(int i=0;i<10;i++)46         if(num[i]!=account[i])47             return false;48     return true;49 }50 void printbign(bignum a){51     for(int i=a.len-1;i>=0;i--)52         printf("%d",a.d[i]);53 }54 int main()55 {56     while(scanf("%s",origin)!=EOF){57         bignum a=str_to_bign(origin);58         a=multi(a,2);59         if(isNumber(a))60             printf("Yes\n");61         else62             printf("No\n");63         printbign(a);64         printf("\n");65     }66     return 0;67 }
View Code

 

A1024. Palindromic Number (25)

http://www.patest.cn/contests/pat-a-practise/1024

 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 struct bignum{ 5     int d[1000]; 6     int len; 7     bignum(){ 8         memset(d,0,sizeof(d)); 9         len=0;10     }11 };12 bignum ChangeToBig(char str[]){13     bignum res;14     res.len=strlen(str);15     for(int i=0;i<res.len;i++)16         res.d[i]=str[res.len-1-i]-'0';17     return res;18 }19 bignum add(bignum a,bignum b){20     bignum res;21     int carray=0;22     for(int i=0;i<a.len || i<b.len;i++){23         int temp=a.d[i]+b.d[i]+carray;24         res.d[res.len++]=temp%10;25         carray=temp/10;26     }27     if(carray!=0)28         res.d[res.len++]=carray;29     return res;30 }31 bignum reverseNum(bignum a){32     bignum res;33     res.len=a.len;34     for(int i=0;i<res.len;i++)35         res.d[i]=a.d[res.len-1-i];36     return res;37 }38 bool isPalin(bignum a){39     int i=0,j=a.len-1;40     while(i<=j){41         if(a.d[i++]!=a.d[j--])42             return false;43     }44     return true;45 }46 void printBig(bignum a){47     for(int i=a.len-1;i>=0;i--)48         printf("%d",a.d[i]);49 }50 int main()51 {52     char str[1000];53     int k;54     while(scanf("%s%d",str,&k)!=EOF){55         bignum a=ChangeToBig(str);56         int step=0;57         bignum b;58         while(step<k && !isPalin(a)){59             b=reverseNum(a);60             a=add(a,b);61             step++;62         }63         printBig(a);64         printf("\n%d\n",step);65     }66     return 0;67 }
View Code

 

0 0
原创粉丝点击