#11404: TLE 求解 我測試的測資都OK 但解題測資卻tle


karta0910489 (unknown)

學校 : 國立臺灣科技大學
編號 : 59669
來源 : [1.170.45.27]
最後登入時間 :
2017-07-17 13:37:34
a021. 大數運算 | From: [140.118.232.16] | 發表日期 : 2016-10-04 01:04

#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;

int subtract(int*,int,int,int);

int main(){
char a[500],b[500],c[500];
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
char num[1];
char op;
int a_num[500],b_num[500],c_num[500];
memset(a_num,'\0',sizeof(a_num));
memset(b_num,'\0',sizeof(b_num));
memset(c_num,'\0',sizeof(c_num));
int counta,countb;
while(cin>>a>>op>>b){
counta=strlen(a);
countb=strlen(b);
for(int i=0;i<=counta;i++){
num[0]=a[counta-1-i];
a_num[i]=atoi(num);
}
for(int i=0;i<=countb;i++){
num[0]=b[countb-1-i];
b_num[i]=atoi(num);
}
switch(op){
int big;
case '+':
if(counta>=countb){
big=counta;
}
else{
big=countb;
}
for(int i=0;i<big;i++){
c_num[i]=a_num[i]+b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]>=10){
c_num[i+1]=(c_num[i+1]+c_num[i]/10);
c_num[i]%=10;
}
}
if(c_num[big]!=0){
cout<<c_num[big];
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
case '-':
if(counta>countb){
big=counta;
for(int i=0;i<big;i++){
c_num[i]=a_num[i]-b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
else if(countb>counta){
big=countb;
for(int i=0;i<big;i++){
c_num[i]=b_num[i]-a_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
cout<<"-";
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
else{
big=counta;
for(int i=0;i<big;i++){
c_num[i]=a_num[i]-b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
if(c_num[big]<0){
big=countb;
for(int i=0;i<big;i++){
c_num[i]=b_num[i]-a_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
cout<<"-";
}
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
break;
case '*':
if(b_num[countb-1]==0){
cout<<"0"<<endl;
break;
}
big=counta+countb-1;
for(int t=0;t<countb;t++){
for(int i=0;i<counta;i++){
c_num[i+t]+=a_num[i]*b_num[t];
}
}
for(int i=0;i<big;i++){
if(c_num[i]>=10){
c_num[i+1]=(c_num[i+1]+c_num[i]/10);
c_num[i]%=10;
}
}
while(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
case '/':
if(b_num[countb-1]==0){
break;
}
int difference=counta-countb;
int y=difference;
int x=0;
while(difference>=0){
for(int i=0;i<countb;i++){
b_num[countb-1+difference]=b_num[countb-1];
}
for(int i=0;i<difference;i++){
b_num[i]=0;
}
while(a_num[counta-1]>0){
for(int i=0;i<counta;i++){
a_num[i]-=b_num[i];
}
for(int i=0;i<counta;i++){
if(a_num[i]<0){
a_num[i+1]-=1;
a_num[i]+=10;
}
}
if(a_num[counta]<0){
for(int i=0;i<counta;i++){
a_num[i]+=b_num[i];
}
for(int i=0;i<counta;i++){
if(a_num[i]>=10){
a_num[i+1]=(a_num[i+1]+a_num[i]/10);
a_num[i]%=10;
}
}
break;
}
x++;
}
c_num[difference]=x;
difference--;
counta--;
}
while(c_num[y]==0){
y--;
}
for(int i=0;i<=y;i++){
cout<<c_num[y-i];
}
cout<<endl;
break;
}
memset(a_num,'\0',sizeof(a_num));
memset(b_num,'\0',sizeof(b_num));
memset(c_num,'\0',sizeof(c_num));
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
}
}

 
#13045: Re:TLE 求解 我測試的測資都OK 但解題測資卻tle


timmy940410 (遊艇)

學校 : 臺北市私立延平高級中學
編號 : 69053
來源 : [122.116.197.27]
最後登入時間 :
2021-02-19 11:39:00
a021. 大數運算 | From: [114.32.213.13] | 發表日期 : 2017-11-24 21:25

#include
#include
#include
using namespace std;

int subtract(int*,int,int,int);

int main(){
char a[500],b[500],c[500];
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
char num[1];
char op;
int a_num[500],b_num[500],c_num[500];
memset(a_num,'\0',sizeof(a_num));
memset(b_num,'\0',sizeof(b_num));
memset(c_num,'\0',sizeof(c_num));
int counta,countb;
while(cin>>a>>op>>b){
counta=strlen(a);
countb=strlen(b);
for(int i=0;i<=counta;i++){
num[0]=a[counta-1-i];
a_num[i]=atoi(num);
}
for(int i=0;i<=countb;i++){
num[0]=b[countb-1-i];
b_num[i]=atoi(num);
}
switch(op){
int big;
case '+':
if(counta>=countb){
big=counta;
}
else{
big=countb;
}
for(int i=0;i<big;i++){
c_num[i]=a_num[i]+b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]>=10){
c_num[i+1]=(c_num[i+1]+c_num[i]/10);
c_num[i]%=10;
}
}
if(c_num[big]!=0){
cout<<c_num[big];
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
case '-':
if(counta>countb){
big=counta;
for(int i=0;i<big;i++){
c_num[i]=a_num[i]-b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
else if(countb>counta){
big=countb;
for(int i=0;i<big;i++){
c_num[i]=b_num[i]-a_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
cout<<"-";
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
else{
big=counta;
for(int i=0;i<big;i++){
c_num[i]=a_num[i]-b_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
if(c_num[big]<0){
big=countb;
for(int i=0;i<big;i++){
c_num[i]=b_num[i]-a_num[i];
}
for(int i=0;i<big;i++){
if(c_num[i]<0){
c_num[i+1]-=1;
c_num[i]+=10;
}
}
cout<<"-";
}
if(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
}
break;
case '*':
if(b_num[countb-1]==0){
cout<<"0"<<endl;
break;
}
big=counta+countb-1;
for(int t=0;t<countb;t++){
for(int i=0;i<counta;i++){
c_num[i+t]+=a_num[i]*b_num[t];
}
}
for(int i=0;i<big;i++){
if(c_num[i]>=10){
c_num[i+1]=(c_num[i+1]+c_num[i]/10);
c_num[i]%=10;
}
}
while(c_num[big-1]==0){
big--;
}
for(int i=0;i<big;i++){
cout<<c_num[big-1-i];
}
cout<<endl;
break;
case '/':
if(b_num[countb-1]==0){
break;
}
int difference=counta-countb;
int y=difference;
int x=0;
while(difference>=0){
for(int i=0;i<countb;i++){
b_num[countb-1+difference]=b_num[countb-1];
}
for(int i=0;i<difference;i++){
b_num[i]=0;
}
while(a_num[counta-1]>0){
for(int i=0;i<counta;i++){
a_num[i]-=b_num[i];
}
for(int i=0;i<counta;i++){
if(a_num[i]<0){
a_num[i+1]-=1;
a_num[i]+=10;
}
}
if(a_num[counta]<0){
for(int i=0;i<counta;i++){
a_num[i]+=b_num[i];
}
for(int i=0;i<counta;i++){
if(a_num[i]>=10){
a_num[i+1]=(a_num[i+1]+a_num[i]/10);
a_num[i]%=10;
}
}
break;
}
x++;
}
c_num[difference]=x;
difference--;
counta--;
}
while(c_num[y]==0){
y--;
}
for(int i=0;i<=y;i++){
cout<<c_num[y-i];
}
cout<<endl;
break;
}
memset(a_num,'\0',sizeof(a_num));
memset(b_num,'\0',sizeof(b_num));
memset(c_num,'\0',sizeof(c_num));
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
}
}

用scanf,printf......


 
ZeroJudge Forum