题目说是初始数字的重排列,自然出现相同数字排列前后出现的次数也要相同。不能用双重循环去find,还要注意个数,不如erase吧,把相等的地方改成一个不可能出现的数字,该位数字就失去了有效性,相当于erase了,如-999,如下。
if(last.d[i]==first.d[j])
{
first.d[j]=-999;
break;
}
#include<bits/stdc++.h>
using namespace std;
struct bign{
int d[30];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[])
{
bign a;
int num=0;
a.len=strlen(str);
for(int i=a.len-1;i>=0;i--)
{
a.d[num++]=str[i]-'0';
}
return a;
}
bign multi(bign a,int b)
{
bign c;
int carry=0;
for(int i=0;i<a.len;i++)
{
int temp=a.d[i]*b+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
while(carry!=0)
{
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
int main()
{
char s[30];
string ss1,ss2;
cin>>s;
bign first,last;
first=change(s);
last=multi(first,2);
for(int i=0;i<last.len;i++)
{
int j;
for(j=0;j<first.len;j++)
if(last.d[i]==first.d[j])
break;
if(j==first.len)
{
printf("No\n");
for(int l=last.len-1;l>=0;l--)
printf("%d",last.d[l]);
return 0;
}
}
printf("Yes\n");
for(int l=last.len-1;l>=0;l--)
printf("%d",last.d[l]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct bign{
int d[30];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[])
{
bign a;
int num=0;
a.len=strlen(str);
for(int i=a.len-1;i>=0;i--)
{
a.d[num++]=str[i]-'0';
}
return a;
}
bign multi(bign a,int b)
{
bign c;
int carry=0;
for(int i=0;i<a.len;i++)
{
int temp=a.d[i]*b+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
while(carry!=0)
{
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
int main()
{
char s[30];
string ss1,ss2;
cin>>s;
bign first,last;
first=change(s);
last=multi(first,2);
for(int i=0;i<last.len;i++)
{
int j;
for(j=0;j<first.len;j++)
{
if(last.d[i]==first.d[j])
{
first.d[j]=-999; //加上这句就能ac
break;
}
}
if(j==first.len)
{
printf("No\n");
for(int l=last.len-1;l>=0;l--)
printf("%d",last.d[l]);
return 0;
}
}
printf("Yes\n");
for(int l=last.len-1;l>=0;l--)
printf("%d",last.d[l]);
return 0;
}