套路和简单思路总是会冲突,这道题明显可以用大整数乘法的套路来写,但是有点小题大做,因为只是将一个位数在20以内的数字乘上一个2而已。不复杂。
用大整数乘法的套路,需要有很多前戏,如下:
#include <cstdio>
#include <cstring>
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[]){
bign a;
a.len=strlen(str);
for (int i=0; i<a.len; i++){
a.d[i]=str[a.len-1-i]-48;
}
return a;
}
void print(bign a){
for (int i=a.len-1; i>=0; i--){
printf("%d",a.d[i]);
}
}
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){
c.d[c.len++]=carry%10;
carry/=10;
}
return c;
}
int isSameCon(bign a, bign b){
if (a.len!=b.len){
return 0;
}else {
int hashA[10]={0};
int hashB[10]={0};
for (int i=0; i<a.len; i++){
hashA[a.d[i]]++;
hashB[b.d[i]]++;
}
for (int i=0; i<10; i++){
if (hashA[i]!=hashB[i]){
return 0;
}
}
return 1;
}
}
int main(){
char num1[30];
scanf("%s",num1);
bign big1=change(num1);
if (isSameCon(big1,multi(big1,2))){
printf("Yes\n");
}else {
printf("No\n");
}
print(multi(big1,2));
}
简单一点的思路, 如下:
#include <cstdio>
#include <cstring>
int isSameCon(char a[], char b[]){
int hashA[10]={0};
int hashB[10]={0};
int lenA=strlen(a);
int lenB=strlen(b);
if (lenA!=lenB){
return 0;
}else {
for (int i=0; i<lenA; i++){
hashA[a[i]-'0']++;
hashB[b[i]-'0']++;
}
for (int i=0; i<10; i++){
if (hashA[i]!=hashB[i]){
return 0;
}
}
return 1;
}
}
int main(){
char num1[30];
scanf("%s",num1);
int len=strlen(num1);
char num2[30];
num2[len]='\0';
int carry=0;
for (int i=len-1; i>=0; i--){
int temp=(num1[i]-48)*2+carry;
num2[i+1]=temp%10+48;;
carry=temp/10;
}
if (carry){
num2[0]=carry+48;
printf("No\n%s",num2);
}else {
if (isSameCon(num1, num2+1)){
printf("Yes\n");
}else {
printf("No\n");
}
printf("%s",num2+1);
}
}