信息学奥赛一本通---第二部分 基础算法 --- 第一章 高精度计算个别题题解

161 阅读3分钟

注:此为c++代码

    虽然我的代码无注释,但如想复制,必须完全搞懂代码所对应的题!

Dev c++这东西点进来的都有吧,详情见我的另一篇文章。

正式进入题解部分:          (本人小白,大佬们请勿吐槽)

1307:

#include<bits/stdc++.h>
using namespace std;
char a1[888],b1[888];
int a[888],b[888],c[8888],lena,lenb,bw,jw,lenc;
bool flag;
int main()
{
	cin>>a1>>b1;
	lena=strlen(a1);
	lenb=strlen(b1);
	for(int i=0;i<=lena-1;i++)
	{
		a[lena-i]=a1[i]-'0';
	}
	for(int i=0;i<=lenb-1;i++)
	{
		b[lenb-i]=b1[i]-'0';
	}
	for(int i=1;i<=lenb;i++)
	{
		jw=0;
		for(int j=1;j<=lena+1;j++)
		{
			c[i+j-1]+=a[j]*b[i]+jw;
			jw=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	lenc=lena+lenb;
	while(c[lenc]==0&&lenc>1) lenc--;
	for(int i=lenc;i>=1;i--)
	{
		cout<<c[i];
	}
	return 0;
}

1308:

#include<bits/stdc++.h>
using namespace std;
int a[305],b[305],c[305];
void init(int x[]){
	string s;
	cin>>s;
	x[0]=s.size();
	for(int i=1;i<=x[0];i++){
		x[i]=s[x[0]-i]-'0';
	}
}
void numcpy(int p[],int q[],int wz){
	for(int i=1;i<=p[0];i++) q[i+wz-1]=p[i];
	q[0]=p[0]+wz-1;
}
int numcmp(int a[],int b[]){
	if(a[0]>b[0]) return 1;
	if(a[0]<b[0]) return -1;
	for(int i=a[0];i>=1;i--){
		if(a[i]>b[i]) return 1;
		if(a[i]<b[i]) return -1;
	}
	return 0;
}
void gjj(int a[],int b[]){
	int flag;
	flag=numcmp(a,b);
	if(flag==0){
		a[0]=0;
		return ;
	}
	if(flag==1){
		for(int i=1;i<=a[0];i++){
			if(a[i]<b[i]){
				a[i+1]--;
				a[i]+=10; 
			}
			a[i]-=b[i];
		}
		while(a[0]>0&&a[a[0]]==0) a[0]--;
	}
}
void gjc(int a[],int b[],int c[]){
	int i,tmp[101];
	c[0]=a[0]-b[0]+1;
	for(i=c[0];i>=1;i--){
		memset(tmp,0,sizeof tmp);
		numcpy(b,tmp,i);
		while(numcmp(a,tmp)>=0){
			c[i]++;
			gjj(a,tmp);
		}
	}
	while(c[c[0]]==0&&c[0]>0) c[0]--;
}
void sc(int a[]){
	if(a[0]==0){
		cout<<0;
		return ;
	}
	for(int i=a[0];i>=1;i--){
		cout<<a[i];
	}
	cout<<endl;
}
int main(){
  	init(a);
  	init(b);
  	gjc(a,b,c);
  	sc(c);
	sc(a); 
	return 0;
}

1309:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[500],b[500],step=0;
char str[500];
void add(int a[],int b[])
{
    int i;
    for(i=1;i<=a[0];i++)
    {
        a[i]+=b[i];
        a[i+1]+=a[i]/n;
        a[i]%=n;
    }
    if(a[a[0]+1]>0)
        a[0]+=1;
}
bool judge(int a[])
{
    int i;
    for(i=1;i<=a[0]/2;i++)
        if(a[i]!=a[a[0]-i+1])
            return false;
    return true;
}
void overturn(int a[])
{
    int i,j;
    b[0]=a[0];
    j=1;
    for(i=a[0];i>=1;i--)
    {
        b[j]=a[i];
        j++;
    }
}
void print(int a[])
{
    int i;
    for(i=a[0];i>=1;i--)
        cout<<a[i];
    cout<<endl;
}
int main()
{
    int len;
    int i;
 
    cin>>n>>str;
    len=strlen(str);
 
    int k=1;
    for(i=len-1;i>=0;i--)
    {
        if('0'<=str[i]&&str[i]<='9')
        {
            a[k]=str[i]-'0';
            k++;
        }
        if('a'<=str[i]&&str[i]<='z')
        {
            a[k]=str[i]-'a'+10;
            k++;
        }
        if('A'<=str[i]&&str[i]<='Z')
        {
            a[k]=str[i]-'A'+10;
            k++;
        }
    }
 
    a[0]=len;
    while(judge(a)==0)
    {
        overturn(a);
        add(a,b);
        step++;
        if(step>30)
            break;
    }
 
    if(step>30)
        cout<<"Impossible"<<endl;
    else
        cout<<step<<endl;
    return 0;
}

1168:

#include<bits/stdc++.h>
using namespace std;
int a[202],b[202],c[202],la,lb,lc,x=0; 
char a1[2000],b1[2000];  
int main ()
{
     
    cin>>a1>>b1;
    la=strlen(a1);
    lb=strlen(b1);
    for(int i=0;i<=la-1;i++)   
    {
        a[la-i]=a1[i]-'0';
    }
    for (int j=0;j<=lb-1;j++)   
    {
        b[lb-j]=b1[j]-'0';
    }
    lc=1;
    while(lc<=la||lc<=lb) 
    {
        c[lc]=a[lc]+b[lc]+x;
        x=c[lc]/10;
        c[lc]%=10;
        lc++;
    }
    c[lc]=x;
    while(c[lc]==0)  
    {
        lc--;
    }
    for(int k=lc;k>=1;k--)   
    {
        cout<<c[k];
    }
    return 0;
}

1169:

#include<bits/stdc++.h>
using namespace std;
char a[888],b[888];
int a1[888],b1[888],c[888],lena,lenb,bw,jw,www;
bool flag;
int main()
{
	cin>>a>>b;
	lena=strlen(a);
	lenb=strlen(b);
	for(int i=0;i<=lena-1;i++)
	{
		a1[lena-i]=a[i]-'0';
	}
	for(int i=0;i<=lenb-1;i++)
	{
		b1[lenb-i]=b[i]-'0';
	}
	if(lena<lenb)
	{
		swap(a1,b1);
		flag=1;
	}
	else if(lena==lenb)
	{
		for(int i=lena;i>=1;i--)
		{
			if(a1[i]<b1[i])
			{
				swap(a1,b1);
				flag=1;
				break;
			}
		}
	}
	for(int lenc=1;lenc<=lena||lenc<=lenb;lenc++)
	{
		bw=a1[lenc]-b1[lenc]-jw;
		if(bw<0)
		{
			bw=a1[lenc]+10-b1[lenc];
			a1[lenc+1]-=1;
		}
		bw%=10;
		c[lenc]=bw;
		www=lenc;
	}
	if(flag==1)
	{
		cout<<"-";
	}
	for(int i=www;i>=1;i--)
	{
		if(c[i]==0)
		{
			www--;
		}
		else
		{
			break;
		}
	}
	for(int i=www;i>=1;i--)
	{
		cout<<c[i];
	}
	return 0;
}

1171:

#include<bits/stdc++.h>
using namespace std;
char a1[888];
int a[888],c[888],lena,d,sb_nmsl_cnm;
int main()
{
	cin>>a1;
	lena=strlen(a1);
	for(int i=0;i<=lena-1;i++)
	{
		a[i]=a1[i]-'0';
	}
	for(int j=2;j<=9;j++)
	{
		d=0;
		for(int i=0;i<=lena-1;i++)
		{
			d=(d*10+a[i])%j;
		}
		if(d==0)
		{
			cout<<j<<" ";
			sb_nmsl_cnm=1;
		}
	}
	if(sb_nmsl_cnm==0)
	{
		cout<<"none";
	}
	return 0;
}

1172:

#include<bits/stdc++.h>
using namespace std;
int a[40000],n,len=1,jw;
int main()
{
	cin>>n;
	a[1]=1;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=len;j++)
		{
			a[j]=a[j]*i+jw;
			jw=a[j]/10;
			a[j]%=10;
		}
		while(jw>0)
		{
			a[++len]+=jw;
			jw/=10;
			a[len]%=10;
		}
	}
	for(int i=len;i>=1;i--)
	{
		printf("%d",a[i]);
	}
	return 0;
}

1174:

#include<bits/stdc++.h>
using namespace std;
char a1[100000],b1[100000];
int lena,lenb,a[100000],b[100000],c[100000],jw,bw,lenc;
int main()
{
	cin>>a1>>b1;
	lena=strlen(a1);
	lenb=strlen(b1);
	for(int i=0;i<=lena-1;i++)
	{
		a[lena-i]=a1[i]-'0';
	}
	for(int i=0;i<=lenb-1;i++)
	{
		b[lenb-i]=b1[i]-'0';
	}
	for(int i=1;i<=lenb;i++)
	{
		jw=0;
		for(int j=1;j<=lena+1;j++)
		{
			c[i+j-1]+=a[j]*b[i]+jw;
			jw=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	lenc=lena+lenb;
	while(c[lenc]==0&&lenc>1) lenc--;
	for(int i=lenc;i>=1;i--)
	{
		cout<<c[i];
	}
	return 0;
}

1175:

#include<bits/stdc++.h>
using namespace std;
char a1[888];
int b=13,a[888],c[888],lena,d,sb_nmsl_cnm;
int main()
{
	cin>>a1;
	lena=strlen(a1);
	for(int i=0;i<=lena-1;i++)
	{
		a[i]=a1[i]-'0';
	}
	for(int i=0;i<=lena-1;i++)
	{
		c[i]=(d*10+a[i])/b;
		d=(d*10+a[i])%b;
	}
	for(int i=0;i<=lena-1;i++)
	{
		if(c[i]!=0)
		{
			sb_nmsl_cnm=i;
			break;
		}
	}
	for(int i=sb_nmsl_cnm;i<=lena-1;i++)
	{
		cout<<c[i];
	}
	cout<<endl<<d;
	return 0;
}

明天发:

信息学奥赛一本通

1176,1184