这一道大数乘法问题,要注意输入是按照字符串进行读入并且为了满足大小位关系采用逆序转换
要注意数组的意义以及循环结构和判断结构的边界
代码如下:
#include<cstdio>
#include<string.h>
using namespace std;
const int N = 30;
struct bign{
int k[N];
int len;
bign(){
memset(k,0,sizeof(k));
len = 0;
};
};
int flag[10];//初值全为0,0..9 0不用
bign change(char s[]){
bign a;
a.len = strlen(s);
for(int i = 0;i<a.len;i++){
a.k[i] = s[a.len-1-i] - '0';//逆序赋值
}
return a;
}
bign doublemulit(bign a){
bign b;
int temp=0;
for(int i = 0;i<a.len;i++){
temp += a.k[i]*2;
b.k[i] = temp%10;//余数
temp /=10;//进位
b.len++;
}
while(temp!=0){//处理超位情况
b.k[b.len] = temp%10;
temp /= 10;
b.len++;
}
return b;
}
int main(){
char s1[N];
scanf("%s",s1);
bign a = change(s1);
for(int i = 0;i<a.len;i++){
flag[a.k[i]]++;
}
bign b = doublemulit(a);
bool flagi=true;
for(int i = 0;i<b.len;i++){
if(flag[b.k[i]]<=0){
printf("No");
flagi = false;
break;
}else{
flag[b.k[i]]--;
}
}
if(flagi==true) printf("Yes");
printf("
");
for(int i = b.len-1;i>=0;i--){
printf("%1d",b.k[i]);
}
return 0;
}