知识点
疑问
暂无
代码
//注意50乘2等于100,其实也没必要。。。
#include "bits/stdc++.h"
using namespace std;
const int maxn = 30;
struct bign{
int d[maxn];
int len;
bign(){
fill(d,d+maxn,0);
len = 0;
}
};
//记录0~9数字出现的次数
int cnt[10];
//输入的字符数组
char str[maxn];
bign change(char str[]){
bign a;
int l = strlen(str);
for(int i=0;i<l;i++){
a.d[i] = str[l-1-i] - '0';
cnt[a.d[i]]++;
a.len++;
}
return a;
}
bign multi(bign a,int b){
bign c;
//初始化进位
int carry = 0;
//从低位开始计算
for(int i=0;i<a.len;i++){
int res = b * a.d[i] + carry;
c.d[c.len++] = res % 10;
carry = res/10;
}
//注意啦,进位要保留
while(carry != 0){
c.d[c.len++] = carry % 10;
carry = carry / 10;
}
return c;
}
int main(){
//初始化为0
fill(cnt,cnt+10,0);
scanf("%s",str);
bign a;
a = change(str);
bign c;
c = multi(a,2);
for(int i=0;i<c.len;i++){
if(cnt[c.d[i]] == 0){
printf("No\n");
for(int i=c.len-1;i>=0;i--){
printf("%d",c.d[i]);
}
return 0;
}else{
cnt[c.d[i]]--;
}
}
printf("Yes\n");
for(int i=c.len-1;i>=0;i--){
printf("%d",c.d[i]);
}
return 0;
}
反思
multi()
函数记得最后要保留进位carry;
二刷代码
- 二刷使用的高精度加法了,没有用乘法。同时老油条更喜欢用
string
而不是char[]
了; - 感觉之前写的代码还是不怎么优雅;
#include <iostream> #include <string> #include <algorithm> using namespace std; struct bign{ int d[30]; int len; bign(){ fill(d,d+30,0); len=0; } }; int preCnt[20]; int afterCnt[20]; bign change(string in){ int len = in.size(); bign res; //读入 for(int i=0;i<len;i++){ res.d[i] = in[len-1-i]-'0'; preCnt[res.d[i]]++;//计数 res.len++; } return res; } bign add(bign a,bign b){ bign res; int carry=0; for(int i=0;i<a.len||i<b.len;i++){ int tmp = a.d[i]+b.d[i]+carry; res.d[res.len] = tmp%10; res.len++; carry=tmp/10; } if(carry!=0){ res.d[res.len] = carry; res.len++; } //得到结果 for(int i=0;i<res.len;i++){ afterCnt[res.d[i]]++; } return res; } int main(){ string in; cin>>in; fill(preCnt,preCnt+20,0); fill(afterCnt,afterCnt+20,0); bign a = change(in); bign b = a; //接下来是高精度加法 bign res = add(a,b); bool flag = true; for(int i=0;i<=9;i++){ if(preCnt[i]!=afterCnt[i]){ flag = false; break; } } if(flag){ printf("Yes\n"); }else{ printf("No\n"); } //进行打印 for(int i=0;i<res.len;i++){ printf("%d",res.d[res.len-1-i]); } return 0; }