提交列表仅存的90分蒟蒻代码求助!!!
查看原帖
提交列表仅存的90分蒟蒻代码求助!!!
178347
是晴天呀楼主2021/10/21 20:15

第五个点不知为何错了(其他点都对),有dl帮忙看一下我哪里出错了吗

#include<bits/stdc++.h>
using namespace std;
string A,B;
int a[15],b[15],suma[11][15],sumb[11][15],ans[11][15];//ans[i][j]表示数字i出现的次数的第j位 
int main()
{
	cin>>A>>B;
	int lena=A.size(),lenb=B.size();
	for(int i=1;i<=lena;i++)
	a[i]=A[lena-i]-'0';
	for(int i=1;i<=lenb;i++)
	b[i]=B[lenb-i]-'0';
	for(int i=1;i<=lena;i++) ans[a[i]][1]++;//计算a包含的数字 
	int flag=1;
	for(int i=1;i<=lenb;i++)
	if(a[i]!=b[i]) flag=0;
	if(flag==1) goto flag1;
	for(int i=0;i<=9;i++)//对于每一个数字 
	for(int j=1;j<lena;j++)
	{
		suma[i][j]+=j*a[j+1];
		suma[i][j+1]+=suma[i][j]/10;
		suma[i][j]%=10;//进位
	}//每一位由于周期而算出的次数 
	for(int i=1;i<=lena;i++)//对于每一位算出特殊值 
	{
		if(a[i]==0)//如果该位为0,则要减之前周期多算的0
		{
			suma[0][i]-=1;
			int j=i;
			while(suma[0][j]<0)//借位 
			{
				suma[0][j+1]-=1;
				suma[0][j]+=10;
				j++;
			}
		}
		for(int j=1;j<a[i];j++)//对于1~a[i]-1 每一个都有10^i次 
		{
			suma[j][i]+=1;
			suma[j][i+1]+=suma[j][i]/10;
			suma[j][i]%=10;//进位 
		}
		suma[a[i]][1]+=1;
		for(int j=1;j<i;j++)//对于a[i] 有1+a[1]+a[2]*10+a[3]*10^2+...+a[i-1]*10^(i-2)次 
		{
			suma[a[i]][j]+=a[j];
			suma[a[i]][j+1]+=suma[a[i]][j]/10;
			suma[a[i]][j]%=10;//进位
		}
	}
	for(int i=0;i<=9;i++)//对于每一个数字 
	for(int j=1;j<lenb;j++)
	{
		sumb[i][j]+=j*b[j+1];
		sumb[i][j+1]+=sumb[i][j]/10;
		sumb[i][j]%=10;//进位
	}//每一位由于周期而算出的次数 
	for(int i=1;i<=lenb;i++)//对于每一位算出特殊值 
	{
		if(b[i]==0)//如果该位为0,则要减之前周期多算的0
		{
			sumb[0][i]-=1;
			int j=i;
			while(sumb[0][j]<0)//借位 
			{
				sumb[0][j+1]-=1;
				sumb[0][j]+=10;
				j++;
			}
		}
		for(int j=1;j<b[i];j++)//对于1~b[i]-1 每一个都有10^i次 
		{
			sumb[j][i]+=1;
			sumb[j][i+1]+=sumb[j][i]/10;
			sumb[j][i]%=10;//进位 
		}
		sumb[b[i]][1]+=1;
		for(int j=1;j<i;j++)//对于b[i] 有1+b[1]+b[2]*10+b[3]*10^2+...+b[i-1]*10^(i-2)次 
		{
			sumb[b[i]][j]+=b[j];
			sumb[b[i]][j+1]+=sumb[b[i]][j]/10;
			sumb[b[i]][j]%=10;//进位
		}
	}
	for(int i=0;i<=9;i++)
	for(int j=1;j<=14;j++)
	if(suma[i][j]>9)
	{
		suma[i][j+1]+=suma[i][j]/10;
		suma[i][j]%=10;
	}//把进位过剩的理清 
	for(int i=0;i<=9;i++)
	for(int j=1;j<=14;j++)
	if(sumb[i][j]>9)
	{
		sumb[i][j+1]+=sumb[i][j]/10;
		sumb[i][j]%=10;
	}//把进位过剩的理清 
	for(int i=0;i<=9;i++)
	{
		for(int j=1;j<=14;j++)
		{
			ans[i][j]+=sumb[i][j]-suma[i][j];
			while(ans[i][j]<0)
			{
				ans[i][j]+=10;
				ans[i][j+1]-=1;
			}
		}
	}
	flag1:
	for(int i=0;i<=9;i++)
	{
		int j=14;
		while(ans[i][j]==0&&j!=1) j--;
		for(j;j>=1;j--)
		printf("%d",ans[i][j]);
		printf(" ");
	}
	return 0;
}
2021/10/21 20:15
加载中...