uva 10106 제품 (고밀도 대수 곱셈)

1766 단어
어제 막 대수 덧셈 을 썼 는데, 오늘 또 대수 곱셈 이 왔 다. 사실 해법 의 차 이 는 많 지 않 지만, 단지 여러 개의 대수 덧셈 으로 바 뀌 었 을 뿐이다.
이미 다른 사람의 알고리즘 을 보면 사실 나 와 차이 가 많 지 않 고 모두 이 자세 이다.와 한 번 했 는데 0 을 생각 하 는 것 을 잊 어 버 렸 어 요. 나중에 문 제 를 내기 전에 다 판단 해 야 돼 요.
변두리 데이터, 빅 데이터 와 작은 데 이 터 를 끊 으 세 요. 아니면 괜 히 시간 이 걸 리 거나 변수 가 정 의 를 반복 하지 않도록 주의해 야 합 니 다!!호출 함수 에 있 지 않 으 면 실수 하기 쉬 워!!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[300];//           
char b[300];//            
int c[600];//                   
int d[600];//               b       
void solve(char c[])//         
{
	char t;
	int len=strlen(c);
	for(int i=0; i<=(len-1)/2; i++)
	{
		t=c[i];
		c[i]=c[len-1-i];
		c[len-1-i]=t;
	}
}
int main()
{
	int i,j,x,k,q,up,up1,max1;
	while(scanf("%s%s",a,b)!=EOF)
	{
		if(strcmp(a,"0")==0||strcmp(b,"0")==0)//     0    
		{
				printf("0
"); continue; } memset(d,0,sizeof(d)); memset(c,0,sizeof(c)); solve(a); solve(b); int lena=strlen(a); int lenb=strlen(b); max1=k=0; for(i=0;i<lena;i++)// a , b { up=0; for(k=0;k<i;k++) c[k]=0; for(j=0;j<lenb;j++) { c[k]=(a[i]-'0')*(b[j]-'0')+up; up=c[k]/10; c[k]=c[k]%10; k++; } if(up!=0) c[k++]=up;//c i b max1=max(max1,k); for(q=0,up=0;q<max1;q++) { if(q>=k) c[q]=0; d[q]=c[q]+d[q]+up; up=d[q]/10; d[q]=d[q]%10; } if(up!=0) d[max1++]=up;//d i b } int flag=1; for(j=max1-1;j>=0;j--) { if(flag==1&&d[j]==0)// 0 continue; printf("%d",d[j]); flag=0; } printf("
"); } }

좋은 웹페이지 즐겨찾기