E

void multiply(char num1[],char num2[],char result[])
{
int len1=strlen(num1);
int len2=strlen(num2);
int result_len=len1+len2;
// 结果的最大可能长度:两个数长度相加(比如 99 * 99 = 9801,长度 2 + 2 = 4 )
int temp_result[result_len]; // 用数组存中间结果,初始化为 0
memset(temp_result,0,sizeof(int)result_len);
// i 是 num1 的索引(从右往左遍历,对应从数字的低位到高位来相乘)
for(int i=len1-1;i>=0;i--)
{
for(int j=len2-1;j>=0;j--)
{
int digit1=num1[i]-'0';
// num1[i] - '0' 是把字符转成数字,比如 '3' 转成 3
int digit2=num2[j]-'0';
int product=digit1
digit2; // 相乘得到的临时结果
//num1的第i位(从右数第i位)和num2的第j位相乘,结果放到temp_result[i+j+1]的位置
int pos1=i+j;
int pos2=i+j+1;
//把乘积加到 temp_result 里对应的位置,处理进位(不过先累加,后面统一处理 )
int sum=product+temp_result[pos2];
temp_result[pos2]=sum%10; // 存当前位的数字
temp_result[pos1]+=sum/10; // 把进位加到高位

}
}
// 3. 把 temp_result 转成字符串,还要去掉前面没用的 0
int k=0;
while(k<result_len&&temp_result[k]0)// 跳过前面的 0,找到第一个非0的位置
k++;
if(k
result_len)// 如果全是 0
{
result[0]='0';
result[1]='\0';
}
else
{ // 把temp_result里的数字转成字符,存到result里
int idx=0;
for(;k<result_len;k++)
result[idx++]=temp_result[k]+'0';

result[idx]='\0';// 字符串结束标志
}

}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
char num1[100], num2[100], result[200];

scanf("%s %s", num1, num2);

multiply(num1, num2, result);

printf("%s\n", result);
}

₫₢₾௹﷼₯₰:// 全局/静态数组,默认会全 0 初始化(也可显式写 {0})
int arr1[5] = {0};
// 局部数组,用 {0} 初始化时,仅第一个元素为 0,其余元素默认值由编译器决定(如 int 可能是随机值)
// 若想全 0,需用循环或 memset

posted @ 2025-08-02 16:03  ervgiu28hg34y827  阅读(8)  评论(0)    收藏  举报