大数乘法之杭电1042

  感觉不仅把改进的代码和思考也记录下来,同时也要把自己目前还是渣渣的原生代码才有所收获和进步。

#include<stdio.h>
#include<string.h>
#define M 400 
int num[M]={0};
int chan(int a[5],int b)
{
	int i;
    for(i=0;;i++)
	{
		a[i]=b/10;
		b=b%10;
		if(b==0) break;
	}
	return ++i;
}
void mul(int N)
{   
	int i,j,n,a[5]={0};
    int len;
	len=chan(a[5],N);
	for(i=M;i>=0&&num[i]==0;i--);
	n=i;
	for(i=0;i<=n;i++)
	{
		for(j=0;j<len;j++)
			num[i+j]=num[i]*num[j];
		if(num[i+j]>9)
		{
			num[i+j+1]+=num[i+j]/10;
	        num[i+j]%=10;
		}
	}
	if(N>1) mul(N-1);
}
int main()
{
	int i,j,N;
	while(scanf("%d",&N)!=EOF)
	{
		num[0]=1;
		mul(N);
		for(i=M;i>=0&&num[i]==0;i--);
		if(i<0)
			printf("0\n");
		else
		{
			for(j=i;j>=0;j--)
				printf("%d",num[i]);
			printf("\n");
		}
	}
	return 0;
}

以下的可以说是复制了某位的代码了,自己看了一遍,然后尝试用其方法改动一二。上交OJ才发现自己犯了一个错误,看来还是没有真正掌握那段代码了。(今天班级春游,而我一上午就弄了这一道题,,,,,,>>>>驽马十驾>>>>)

#include<stdio.h>
#include<string.h>
#define M 100000
#define base 10000
int main()
{
	int i,j,n,a[M]={0};
	int end;
	while(scanf("%d",&n)!=EOF)
	{
	    memset(a,0,sizeof(a));
		end=0;
		a[0]=1;
		for(i=1;i<=n;i++)
		{
			for(j=0;j<=end;j++)
				a[j]*=i;
			for(j=0;j<=end;j++)
			{
			    if(a[j]>base&&j==end)
				{
			      int carry=a[j]/base;
			      a[j]%=base;
			      a[j+1]+=carry;
			      end++;
				}
		        else if(a[j]>base)
				{
				  int carry=a[j]/base;
				  a[j]%=base;
				  a[j+1]+=carry;
				}
			}
		}
 
		printf("%d",a[end]);
		for(i=end-1;i>=0;i--)
			printf("%04d",a[i]);
		printf("\n");
	}
	return 0;
}
编程记录:1,runtime  error (运行时错误)就是程序运行到一半,程序就崩溃了。
比如说:(复制某位CSDN里的高人的)
①除以零
②数组越界:int a[3]; a[10000000]=10;
③指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;
④使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free(p); *p=10;

⑤数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];

2,memset(void *s,c,unsigned m)串设置函数。

3.优化:每多位数进一一位,数组的一位元素可存储多位数滴!!!!!

4.printf("%04d",a[i])>>>>>>%04d>>>>>>输出四位,不够用0补。

 >>>>>>>>>功在不舍>>>>>>>>>>


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页