#8607: wa line9 輸出短少


manytina39 (manytina39)

學校 : 國立清華大學
編號 : 38813
來源 : [114.24.62.51]
最後登入時間 :
2014-10-20 19:23:37
a021. 大數運算 | From: [114.36.45.130] | 發表日期 : 2014-02-04 18:06

#include<stdio.h>

int main()
{
 char string[1003];
 int j,k,m,n,r,len1,len2,temp;
 
 while(gets(string)!=NULL){
  int i=0,count=0,a=0,b=0,flag=1,p=0;
  int number[500]={};
  int buffer[500]={};
  int remain[500]={};

  for(i=0; ;i++){
   if(string[i]==' ')
    a=i;
   else if(string[i]=='\0'){
    b=i;
    break;
   }
   
   if(string[i]>=48 && string[i]<=57)
    string[i]-=48;
  }  
  len1=a-2;
  len2=b-a-1;

  if(string[a-1]=='+'){
   if(len1>len2){
    for(j=0;j<len1;j++){
     if(j<len2)
      number[j]=string[a-3-j]+string[b-1-j]+count;
     else
      number[j]=string[a-3-j]+count;
     count=0;
     
     if(number[j]>=10){
      number[j]-=10;
      count++;
     }
    }
   }
   else if(len1==len2){
    for(j=0;j<len1;j++){
     number[j]=string[a-3-j]+string[b-1-j]+count;
     count=0;
     
     if(number[j]>=10){
      number[j]-=10;
      count++;
     }
    }
   }
   else{
    for(j=0;j<len2;j++){
     if(j<len1)
      number[j]=string[a-3-j]+string[b-1-j]+count;
     else
      number[j]=string[b-1-j]+count;
     count=0;
     
     if(number[j]>=10){
      number[j]-=10;
      count++;
     }
    }
   }
   if(count==1)
    printf("1");
   for(k=j-1;k>=0;k--){
    printf("%d",number[k]);
   }
   printf("\n");
  }
  else if(string[a-1]=='-'){
   if(len1>len2){
    for(j=0;j<len1;j++){
     if(j<len2)
      number[j]=string[a-3-j]-string[b-1-j]-count;
     else
      number[j]=string[a-3-j]-count;
     count=0;
     
     if(number[j]<0){
      number[j]+=10;
      count++;
     }
    }
   }
   else if(len1==len2){
    for(j=0;j<len1;j++){
     if(string[j]-string[a+1+j]>0){
      flag=1;
      break;
     }
     else if(string[j]-string[a+1+j]<0){
      flag=0;
      break;
     }
     else
      continue;
    }
    for(j=0;j<len1;j++){
     if(flag==1)
      number[j]=string[a-3-j]-string[b-1-j]-count;
     else
      number[j]=string[b-1-j]-string[a-3-j]-count;
     count=0;
     
     if(number[j]<0){
      number[j]+=10;
      count++;
     }         
    }
   }
   else{
    for(j=0;j<len2;j++){
     flag=0;
     
     if(j<len1)
      number[j]=string[b-1-j]-string[a-3-j]-count;
     else
      number[j]=string[b-1-j]-count;
     count=0;
     
     if(number[j]<0){
      number[j]+=10;
      count++;
     }
    } 
   }
   if(flag==0)
    printf("-");
   for(k=j-1;k>=0;k--){
    if(number[k]!=0)
     break;
   }
   for(m=k;m >=0;m--)
    printf("%d",number[m]);
   printf("\n");  
  }
  else if(string[a-1]=='*'){
   for(j=0;j<len2;j++){
    for(n=0;n<len1;n++)
     number[n+j]+=string[a-3-n]*string[b-1-j];
   }
   for(m=0;m <n+j-2;m++){
    if(number[m]>=10){
     temp=number[m];
     number[m]=temp%10;
     number[m+1]+=(int)temp/10;
    }
   }
   
   if(number[m]!=0)
    printf("%d",number[m]);
   for(k=m-1;k>=0;k--)
    printf("%d",number[k]);
   printf("\n");   
  }
  else if(string[a-1]=='/'){
   for(j=len2-1;j<len1;j++){
    for(k=1;k<=9;k++){     
     for(m=0;m <len2;m++){
      buffer[j-m]=k*string[b-1-m]+count;
      count=0;      
      if(buffer[j-m]>=10){
       count=(int)buffer[j-m]/10;
       buffer[j-m]%=10;
      }        
     }
     if(count!=0)
      buffer[j-m]=count;
     count=0;
     
     for(m=0;m <=j;m++){   
      if(buffer[m]>string[m]){
       flag=0;
       break;       
      }
      else if(buffer[m]<string[m]){
       flag=1;
       break;
      }
      else
       continue;
     }
     if(flag==0)
      break;    
    }
    flag=1;
       
    number[p]=k-1;
    for(m=0;m <len2;m++){
     remain[j-m]=number[p]*string[b-1-m]+count;
     count=0;     
     if(remain[j-m]>=10){
      count=(int)remain[j-m]/10;
      remain[j-m]%=10;
     }
    }
    if(count!=0)
     remain[j-m]=count;
    count=0;
    p++;
     
    for(m=0;m <len2;m++){
     string[j-m]=string[j-m]-remain[j-m]-count;
     count=0;
     if(string[j-m]<0){
      string[j-m]+=10;
      count++;
     }
    }
    if(count!=0)
     string[j-m]--;
    else if(string[j-m]!=0)
     string[j-m]=string[j-m]-remain[j-m];
    count=0;
    
    for(m=0;m <=j;m++)
     buffer[m]=0;     
   }
   
   for(m=0;m <p;m++){
    if(number[m]!=0)
     break;
   }
   for(r=m;r<p;r++)
    printf("%d",number[r]);
   printf("\n");
  }
 }
 return 0;
}

 OJ說我輸出了八行

但是我的作法 測資最多只有一行

怎麼會這樣?

 

 

 
#8941: Re:wa line9 輸出短少


chihung108 (chihung)

學校 : 國立高雄大學
編號 : 40280
來源 : [111.251.216.45]
最後登入時間 :
2020-04-02 12:51:35
a021. 大數運算 | From: [1.174.176.217] | 發表日期 : 2014-07-04 16:32

 


我也有遇到這種情況,假設你的運算都正確的話

你可能沒有考慮到 / 0 或者 兩樹相減 為 0 的情況,這兩種情況要輸出 0

參考看看~ 

 
#13003: Re:wa line9 輸出短少


fantasy_whale (幻光海鯨)

學校 : 國立中山大學
編號 : 42092
來源 : [27.242.108.33]
最後登入時間 :
2020-10-26 22:41:49
a021. 大數運算 | From: [111.254.243.216] | 發表日期 : 2017-11-18 22:39

我也遇過這個狀況,第九行是 21454 / 112343... 輸出會是0,

1.檢查你的資料能否顯示0

2.檢查你的除法 當 小/大 的時候 你的程式碼能否正常運作

 
ZeroJudge Forum