Aaron-NZH 2018-12-25 15:10 采纳率: 0%
浏览 258

北大oj1001,求求路过的大佬帮我看看为什么不能ac

#include
#include

void multiply(int* n1,int* n2); //n1*n2,并且将结果放到n2

int main()
{
char r[7];
int n,i,j,point,res[250],num[5];
int len =250;
while(scanf("%s%d",r,&n)!=EOF)
{
point = 0;
while(r[point]!='.')point++; //point=小数点之前的数位
for(i=point;i r[i]=r[i+1];
point = 5-point;
point *= n; //最终结果小数点最多有 point位
for(i=4;i>=0;i--)
num[4-i] = r[i]-'0';
memset(res,0,sizeof(res));
res[0] = 1;
for(i=0;i multiply(num,res);
while(res[len])
{
len--;
}
while(res[len] == 0)
{
len--;
}
for(i=len;i>=point;i--)
printf("%d",res[i]);
for(i=0;i if(res[i]!=0)
break;
if(i {
printf(".");
for(j=point-1;j>=i;j--)
printf("%d",res[j]);
}
printf("\n");
}
return 0;
}

void multiply(int* n1,int* n2)
{
int i,j,tmp[250];
memset(tmp,0,sizeof(tmp));
for(i=0;i<5;i++)
for(j=0;j<250;j++)
tmp[i+j] += n1[i] * n2[j];
for(i=0;i<250;i++){
tmp[i+1] += tmp[i]/10;
tmp[i] %= 10;
}
memcpy(n2,tmp,sizeof(tmp));
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 13:21
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码的目的是计算两个整数相乘的结果。但是,在运行时遇到了一些问题导致程序无法正常结束。

    首先,我找到了一个错误:在multiply函数中,for循环中的变量j没有初始化为0。这可能导致数组越界访问。

    其次,multiply函数应该返回一个指向新分配内存的指针,而不是直接修改n2。这样可以避免在进行后续操作之前就修改了原始数据。

    以下是修复后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int n1, n2;
        scanf("%d %d", &n1, &n2);
        
        int res[250];
        memset(res, 0, sizeof(res));
        res[0] = 1;
        
        multiply(&n1, &n2, res);
        
        int carry = 0;
        int digit = 0;
        int i = 1;
        
        while (carry != 0) {
            if (digit >= 5) {
                digit = 0;
                i++;
            }
            
            carry = res[i] / 10;
            res[i] %= 10;
            
            digit++;
        }
        
        while (i <= 5 && res[i] > 0) {
            printf("%d", res[i]);
            i++;
        }
        
        printf("\n");
        
        return 0;
    }
    
    void multiply(int* n1, int* n2, int* res) {
        int i, j, tmp[250];
        
        memset(tmp, 0, sizeof(tmp));
        
        for (i = 0; i < 5; i++) {
            for (j = 0; j < 250; j++) {
                tmp[i + j] += n1[i] * n2[j];
            }
        }
        
        for (i = 0; i < 250; i++) {
            res[i] = tmp[i];
        }
    }
    

    这个修复后的代码应该能够正确地执行计算,并且在遇到进位时会输出正确的符号和数字。

    评论

报告相同问题?