题解: 有一种属于我自己的解法就是高精度相乘解法,若是熟悉高精度相乘的话一点也不麻烦,当然正经解法更能省却时间.
在此讲解,正经解法的思路,高精度相乘的解法,可以自己去上网学习高精度相乘再加点编程逻辑就可以做到(笨方法)
①做过滚动数组题目一定会熟悉这种做法:将这些数相乘,为了防止爆精度我们可以对每个数取其0位数和0位数的前四位,很简单就做出来了。
②分解质因数类似思维:其实0就是2*5产生的,为什么不是4和5还是什么5和6其他的,这就是分解质因数的思维,首先产生0的乘法肯定有5,5是质因数,另一位其实一直都是2的质因数,4也好,6也好,这些都能被质因数2分解,也就是说我们只要将每个数分解成只有2和5的形式并统计2的个数和5的个数就能解决问题。
只插入高精度的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 10000
//高精度乘法暴力大法解决
char a[M];
int num1[M];
int num2[M];
int num[M];
void fun(char *str1,char *str2)
{
int i,j;
for(i=0;i<strlen(str1);i++)
num1[i] = str1[strlen(str1)-1-i]-'0';
for(j=0;j<strlen(str2);j++)
num2[j] = str2[strlen(str2)-1-j]-'0';
int r;
for(i=0;i<strlen(str1);i++)
{
r=0;
for(j=0;j<strlen(str2);j++)
{
num[i+j]+=num1[i]*num2[j]+r;
r=num[i+j]/10;
num[i+j]%=10;
}
num[i+j]+=r;
}
for(i=M-1;i>=0;i--)
if(num[i]!=0)
break;
for(j=0;j<=i;j++)
str1[j]=num[i-j]+'0';
str1[j]='\0'; //注意:字符串最后一位是结束符
for(i=0;i<M;i++)
num[i]=0;
}
int main()
{
char sum[M],count=0;
for(int i=0;i<M-1;i++)
sum[i] = '0';
scanf("%s",sum);
for(int i=0;i<99;i++)
{
scanf("%s",a);
fun(sum,a);
}
puts(sum);
for(int j=strlen(sum)-1;j>=0;j--)
{
if(sum[j]!='0')
break;
count++;
}
printf("%d",count);
return 0;
}