帮忙看下
1、在自己电脑上测试没有问题,oj显示答案错误。提交的语言是c++。
2、这个代码哪里不符合C99标准,为什么不能使用C提交。
--------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct inputNum input_Num;
typedef struct answer ans;
struct inputNum{
int a;
int x;
int n;
};
struct answer{ //计算的结果保存的地方,a为保存结果的数组,例如输入9512 -2 12 ,计算时会计算9512^12,[10^(-2)]^12
//假如结果为123456789 *[10^(-6)] 保存时就是 a=[6789][2345][1][0][0]……,len=3,x=-6
//
int *a;
int len;
int maxSize;
int x;
};
int initAnswer(struct answer &an){//初始化结构体
an.maxSize=250;
an.len=1;
an.x=0;
an.a=(int *)malloc(an.maxSize*sizeof(int));
an.a[0]=1;
for(int i=1;i<an.maxSize;i++)
an.a[i]=0;
return 0;
}
int clearAnswer(struct answer &an){//清除结构体中的数据
an.maxSize=250;
an.len=1;
an.x=0;
an.a[0]=1;
for(int i=1;i<an.maxSize;i++)
an.a[i]=0;
return 0;
}
int calculate(struct inputNum in,struct answer &an){ //输入为9512 -2 12,输出为answer结构体,
an.x=in.x*in.n;//计算[10^(-2)]^12,结果为10^(-24)
for(int i=0;i<in.n;i++){
if(an.len==an.maxSize-1){//如果answer结构中a的空间不足就分配空间
an.maxSize+=10;//
an.a=(int *)realloc(an.a,an.maxSize*sizeof(int));//
}//
for(int j=0;j<an.len;j++){//具体的计算过程
an.a[j]=(in.a)*(an.a[j]);//第一轮a=[1][0][0][0][0]……,第二轮a=[9512][0][0][0][0]……
if(j!=0){//第三轮a=[8144][9047][0][0][0]……
an.a[j]+=(an.a[j-1]/10000); //直至计算完毕
an.a[j-1]=(an.a[j-1]%10000);
}
}
if(an.a[an.len-1]>=10000){//控制进位
int j=an.len++;
an.a[j]+=(an.a[j-1]/10000);
an.a[j-1]=(an.a[j-1]%10000);
if(an.a[an.len-1]>=10000){
int j=an.len++;
an.a[j]+=(an.a[j-1]/10000);
an.a[j-1]=(an.a[j-1]%10000);}
}
}
return 0;
}
int printAnswer(struct answer an){//输出结果
if(an.x>=0){//如果x大于零说明结果中没有小数,直接输出
printf("%d",an.a[an.len-1]);
int jj=an.len-2;
for(jj=an.len-2;jj>=0;jj--){
printf("%04d",an.a[jj]);
}
for(;an.x>0;an.x--)//计算x中存的数字,在结果后面添加对应数量的0
printf("0");
return 0;
}//如果x小于零,则说明有小数
int s,p;//s 1-len p 1-4//s、p保存小数点的位置,a=[8144][9047][0][0][0]……结果为90.478144
//则s=1,p=2;
s=(-an.x)/4;
p=(-an.x)%4;
int headL;//计算最高位的位数,9047就是4
if(an.a[an.len-1]/1000!=0)headL=4;
else if(an.a[an.len-1]/100!=0)headL=3;
else if(an.a[an.len-1]/10!=0)headL=2;
else headL=1;
int newX=(headL+(an.len-1)*4+an.x);//计算a中保存的数据总长度,加上上面计算的10^(-24)中的-24,确定小数点的位置
if(newX>0){//newX大于零表示是1.2343等大于1的数,不需要填充0,小于0则是类似于0.123 0.00012等需要填充0
int a,b,c,d;
a=an.a[s]/1000;
b=(an.a[s]%1000)/100;
c=(an.a[s]/10)%10;
d=an.a[s]%10;
if(s==an.len-1){//如果小数点在最高位中,输出最高位,然后输出所有的数据。
switch(p){
case 0 : {printf("%d",an.a[an.len-1]);
if(s!=0)printf(".");
break;}
case 1 : {printf("%d.%d",an.a[an.len-1]/10,d);
break;}
case 2 : {printf("%d.%d%d",an.a[an.len-1]/100,c,d);
break;}
case 3 : {printf("%d.%d%d%d",a,b,c,d);
break;}
default:break;
}
int j=an.len-2;;
for(j=an.len-2;j>=0;j--)printf("%04d",an.a[j]);
}else{
int j=an.len-2;
printf("%d",an.a[an.len-1]);
for(j=an.len-2;j>s;j--)printf("%04d",an.a[j]);
if(j==s){
switch(p){
case 0 : {printf("%04d",an.a[s]);
if(s!=0)printf(".");
break;}
case 1 : {printf("d%d%d.%d",a,b,c,d);
break;}
case 2 : {printf("%d%d.%d%d",a,b,c,d);
break;}
case 3 : {printf("%d.%d%d%d",a,b,c,d);
break;}
default:break;
}
}
for(j=s-1;j>=0;j--)printf("%04d",an.a[j]);
}}else{
//这里的就是类似于0.0012的数
printf("."); //输出 .
for(;newX<0;newX++) //输出 00
printf("0");
printf("%d",an.a[an.len-1]);
for(int j=an.len-2;j>=0;j--){ //输出12
printf("%04d",an.a[j]);
}
}
return 0;
}
int main(){
double R;//R和n对应输入的底数和幂
int n;
input_Num in; //存放输入数据的结构体
ans an;//存放计算结果的结构体
initAnswer(an);//初始化结构体
while(scanf("%lf%d",&R,&n)!=EOF){//输入例如为95.120 12
if(R>=10){ //转化为 95120 -3 12 并存入InputNumber结构体
in.a=(int)(R*1000);//
in.x=-3;//
in.n=n;}
else{
in.a=(int)(R*10000);
in.x=-4;
in.n=n;
}
if(in.a%10000==0){in.a=in.a/10000;in.x+=4;} //转化为9512 -2 12 并修改结构体数据
else if(in.a%1000==0){in.a=in.a/1000;in.x+=3;}
else if(in.a%100==0){in.a=in.a/100;in.x+=2;}
else if(in.a%10==0){in.a=in.a/10;in.x+=1;}
calculate(in,an);//计算,下转到计算函数calculate内部
printAnswer(an);
printf("\n");
clearAnswer(an);
}
return 0;
}
1、在自己电脑上测试没有问题,oj显示答案错误。提交的语言是c++。
2、这个代码哪里不符合C99标准,为什么不能使用C提交。
--------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct inputNum input_Num;
typedef struct answer ans;
struct inputNum{
int a;
int x;
int n;
};
struct answer{ //计算的结果保存的地方,a为保存结果的数组,例如输入9512 -2 12 ,计算时会计算9512^12,[10^(-2)]^12
//假如结果为123456789 *[10^(-6)] 保存时就是 a=[6789][2345][1][0][0]……,len=3,x=-6
//
int *a;
int len;
int maxSize;
int x;
};
int initAnswer(struct answer &an){//初始化结构体
an.maxSize=250;
an.len=1;
an.x=0;
an.a=(int *)malloc(an.maxSize*sizeof(int));
an.a[0]=1;
for(int i=1;i<an.maxSize;i++)
an.a[i]=0;
return 0;
}
int clearAnswer(struct answer &an){//清除结构体中的数据
an.maxSize=250;
an.len=1;
an.x=0;
an.a[0]=1;
for(int i=1;i<an.maxSize;i++)
an.a[i]=0;
return 0;
}
int calculate(struct inputNum in,struct answer &an){ //输入为9512 -2 12,输出为answer结构体,
an.x=in.x*in.n;//计算[10^(-2)]^12,结果为10^(-24)
for(int i=0;i<in.n;i++){
if(an.len==an.maxSize-1){//如果answer结构中a的空间不足就分配空间
an.maxSize+=10;//
an.a=(int *)realloc(an.a,an.maxSize*sizeof(int));//
}//
for(int j=0;j<an.len;j++){//具体的计算过程
an.a[j]=(in.a)*(an.a[j]);//第一轮a=[1][0][0][0][0]……,第二轮a=[9512][0][0][0][0]……
if(j!=0){//第三轮a=[8144][9047][0][0][0]……
an.a[j]+=(an.a[j-1]/10000); //直至计算完毕
an.a[j-1]=(an.a[j-1]%10000);
}
}
if(an.a[an.len-1]>=10000){//控制进位
int j=an.len++;
an.a[j]+=(an.a[j-1]/10000);
an.a[j-1]=(an.a[j-1]%10000);
if(an.a[an.len-1]>=10000){
int j=an.len++;
an.a[j]+=(an.a[j-1]/10000);
an.a[j-1]=(an.a[j-1]%10000);}
}
}
return 0;
}
int printAnswer(struct answer an){//输出结果
if(an.x>=0){//如果x大于零说明结果中没有小数,直接输出
printf("%d",an.a[an.len-1]);
int jj=an.len-2;
for(jj=an.len-2;jj>=0;jj--){
printf("%04d",an.a[jj]);
}
for(;an.x>0;an.x--)//计算x中存的数字,在结果后面添加对应数量的0
printf("0");
return 0;
}//如果x小于零,则说明有小数
int s,p;//s 1-len p 1-4//s、p保存小数点的位置,a=[8144][9047][0][0][0]……结果为90.478144
//则s=1,p=2;
s=(-an.x)/4;
p=(-an.x)%4;
int headL;//计算最高位的位数,9047就是4
if(an.a[an.len-1]/1000!=0)headL=4;
else if(an.a[an.len-1]/100!=0)headL=3;
else if(an.a[an.len-1]/10!=0)headL=2;
else headL=1;
int newX=(headL+(an.len-1)*4+an.x);//计算a中保存的数据总长度,加上上面计算的10^(-24)中的-24,确定小数点的位置
if(newX>0){//newX大于零表示是1.2343等大于1的数,不需要填充0,小于0则是类似于0.123 0.00012等需要填充0
int a,b,c,d;
a=an.a[s]/1000;
b=(an.a[s]%1000)/100;
c=(an.a[s]/10)%10;
d=an.a[s]%10;
if(s==an.len-1){//如果小数点在最高位中,输出最高位,然后输出所有的数据。
switch(p){
case 0 : {printf("%d",an.a[an.len-1]);
if(s!=0)printf(".");
break;}
case 1 : {printf("%d.%d",an.a[an.len-1]/10,d);
break;}
case 2 : {printf("%d.%d%d",an.a[an.len-1]/100,c,d);
break;}
case 3 : {printf("%d.%d%d%d",a,b,c,d);
break;}
default:break;
}
int j=an.len-2;;
for(j=an.len-2;j>=0;j--)printf("%04d",an.a[j]);
}else{
int j=an.len-2;
printf("%d",an.a[an.len-1]);
for(j=an.len-2;j>s;j--)printf("%04d",an.a[j]);
if(j==s){
switch(p){
case 0 : {printf("%04d",an.a[s]);
if(s!=0)printf(".");
break;}
case 1 : {printf("d%d%d.%d",a,b,c,d);
break;}
case 2 : {printf("%d%d.%d%d",a,b,c,d);
break;}
case 3 : {printf("%d.%d%d%d",a,b,c,d);
break;}
default:break;
}
}
for(j=s-1;j>=0;j--)printf("%04d",an.a[j]);
}}else{
//这里的就是类似于0.0012的数
printf("."); //输出 .
for(;newX<0;newX++) //输出 00
printf("0");
printf("%d",an.a[an.len-1]);
for(int j=an.len-2;j>=0;j--){ //输出12
printf("%04d",an.a[j]);
}
}
return 0;
}
int main(){
double R;//R和n对应输入的底数和幂
int n;
input_Num in; //存放输入数据的结构体
ans an;//存放计算结果的结构体
initAnswer(an);//初始化结构体
while(scanf("%lf%d",&R,&n)!=EOF){//输入例如为95.120 12
if(R>=10){ //转化为 95120 -3 12 并存入InputNumber结构体
in.a=(int)(R*1000);//
in.x=-3;//
in.n=n;}
else{
in.a=(int)(R*10000);
in.x=-4;
in.n=n;
}
if(in.a%10000==0){in.a=in.a/10000;in.x+=4;} //转化为9512 -2 12 并修改结构体数据
else if(in.a%1000==0){in.a=in.a/1000;in.x+=3;}
else if(in.a%100==0){in.a=in.a/100;in.x+=2;}
else if(in.a%10==0){in.a=in.a/10;in.x+=1;}
calculate(in,an);//计算,下转到计算函数calculate内部
printAnswer(an);
printf("\n");
clearAnswer(an);
}
return 0;
}