1065. A+B and C (64bit) (20)

来源:互联网 发布:女孩穿衣打扮知乎 编辑:程序博客网 时间:2024/06/12 23:27

点击打开链接

最后一点没过

注意:

1.大数的结构体

struct bign{    int d[MAX];    int len;    int flag;    //结构体初始化,写在结构体内部,函数无参数无返回值,函数名为结构体名    bign(){        memset(d,0,sizeof(d));        len=0;        flag=1;    }}
2.大数转化

bign chan(char c[]){bign b;int stop=0;if(c[0]=='-'){b.flag=0;stop=1;}else{b.flag=1;}        //倒着存储,即d中先存个位,十位,百位...        for(int i=strlen(c)-1;i>=stop;i--){b.d[b.len++]=c[i]-'0';}return b;}

3.大数比较

int comp(bign a,bign b){        //对于一个正数一个负数直接给出大小        if(a.flag==0 && b.flag==1){return -1;}else if(a.flag==1 && b.flag==0){return 1;}else{                //同号的数字比较,先看长度(位数),正数越长越大,负数越长越小                if(a.len>b.len){if(a.flag==0){return -1;}else{return 1;}}else if(a.len<b.len){if(a.flag==0){return 1;}else{return -1;}}else{                      //对于同号同长度,看最高位是否相同,因为d中是倒着存的,因此先最高位在d[len-1]的位置上                      for(int i=a.len-1;i>=0;i--){if(a.d[i]>b.d[i]){if(a.flag==0){return -1;}else{return 1;}}else if(a.d[i]<b.d[i]){if(a.flag==0){return 1;}else{return -1;}}}return 0;}}}

4.大数相加,注意进位

错误写法:ans.len的赋值不对,因为可能有最高位有进1

bign add(bign a,bign b){int len=a.len<b.len?b.len:a.len;int jin=0;bign ans;ans.len=len;for(int i=0;i<len;i++){ans.d[i]=jin+a.d[i]+b.d[i];if(ans.d[i]>9){ans.d[i]%=10;jin=1;}else{jin=0;}}return ans;}

正确的加法

bign add(bign a,bign b){int len=a.len<b.len?b.len:a.len;int jin=0;bign ans;for(int i=0;i<len;i++){//不管加出来的数字是1位数还是2位数,都可以这样写int tmp=jin+a.d[i]+b.d[i];ans.d[ans.len++]=tmp%10;jin=tmp/10;}//最后有进位if(jin!=0){ans.d[ans.len++]=jin;}return ans;}



5.大数相减,注意①借位②高位为0时,不算长度,因此计算完成后要重新更新长度

bign sub(bign a,bign b){int len=a.len<b.len?b.len:a.len;bign ans;for(int i=0;i<len;i++){if(a.d[i]<b.d[i]){a.d[i+1]--;ans.d[i]=a.d[i]+10-b.d[i];}else{ans.d[i]=a.d[i]-b.d[i];}}       //更新长度       for(int i=len-1;i>=0;i--){if(ans.d[i]!=0){ans.len=i+1;break;}if(i==0){ans.len=1;}}return ans;}


#include <cstdio>#include <string.h>#define MAX 10000char a[MAX],b[MAX],c[MAX];struct bign{int d[MAX];int len;int flag;bign(){memset(d,0,sizeof(d));len=0;flag=1;}};bign chan(char c[]){bign b;int stop=0;if(c[0]=='-'){b.flag=0;stop=1;}else{b.flag=1;}for(int i=strlen(c)-1;i>=stop;i--){b.d[b.len++]=c[i]-'0';}return b;}int comp(bign a,bign b){if(a.flag==0 && b.flag==1){return -1;}else if(a.flag==1 && b.flag==0){return 1;}else{if(a.len>b.len){if(a.flag==0){return -1;}else{return 1;}}else if(a.len<b.len){if(a.flag==0){return 1;}else{return -1;}}else{for(int i=a.len-1;i>=0;i--){if(a.d[i]>b.d[i]){if(a.flag==0){return -1;}else{return 1;}}else if(a.d[i]<b.d[i]){if(a.flag==0){return 1;}else{return -1;}}}return 0;}}}bign add(bign a,bign b){int len=a.len<b.len?b.len:a.len;int jin=0;bign ans;for(int i=0;i<len;i++){int tmp=jin+a.d[i]+b.d[i];ans.d[ans.len++]=tmp%10;jin=tmp/10;}if(jin!=0){ans.d[ans.len++]=jin;}return ans;}bign sub(bign a,bign b){int len=a.len<b.len?b.len:a.len;bign ans;for(int i=0;i<len;i++){if(a.d[i]<b.d[i]){a.d[i+1]--;ans.d[i]=a.d[i]+10-b.d[i];}else{ans.d[i]=a.d[i]-b.d[i];}}for(int i=len-1;i>=0;i--){if(ans.d[i]!=0){ans.len=i+1;break;}if(i==0){ans.len=1;}}return ans;}int main(){freopen("in.txt","r",stdin);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s %s %s",a,b,c);bign aa=chan(a);bign bb=chan(b);bign cc=chan(c);bign d;//k判断加减有问题if( (aa.flag==1 && bb.flag==0) || (aa.flag==0 && bb.flag==1)){int k=comp(aa,bb);if(k==1){bb.flag=1;int kk=comp(aa,bb);if(kk==1){d=sub(aa,bb);d.flag=1;}else{d=sub(bb,aa);d.flag=0;}}else{aa.flag=1;int kk=comp(aa,bb);if(kk==1){d=sub(aa,bb);d.flag=0;}else{d=sub(bb,aa);d.flag=1;}}}else{d=add(aa,bb);if(aa.flag==0){d.flag=0;}else{d.flag=1;}}int res=comp(d,cc);printf("Case #%d: ",i);if(res>0){printf("true\n");}else{printf("false\n");}}return 0;}


0 0
原创粉丝点击