該句話的意思模模糊糊,通過樣例才瞭解大概:if doubling the input number gives a number that consists of only a permutation of the digits in the original number.翻譯:如果將輸入數加倍,則給出一個僅由原始數中的數字排列組成的數.我是用兩個相同數相加的方式做的,有兩個測試點無法通過,代碼寫得太糟.
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int ori[10]={0},now[10]={0};
struct node{
int d[22];
int len;
node(){
memset(d,0,sizeof(d));
len=0;
}
};
node obtainRes(int d1[21],int d2[21],int len){
node n;
int carry=0;
for(int i=0;i<len;i++){
int temp=carry+d1[i]+d2[i];
n.d[i]=temp%10;
now[temp%10]++;
carry=temp/10;
}
if(carry>0){
n.len=len+1;
n.d[len]=carry;
now[carry]++;
}else{
n.len=len;
}
return n;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char str[21];
int d1[21],d2[21],len;
node n;
scanf("%s",str);
len=strlen(str);
for(int i=len-1;i>=0;i--){
d1[len-i-1]=d2[len-i-1]=str[i]-'0';
ori[str[i]-'0']++;
}
n=obtainRes(d1,d2,len);
if(n.len!=len){
printf("No\n");
}else{
int i;
for(i=0;i<len;i++){
if(ori[i]!=now[i]){
printf("No\n");
break;
}
}
if(i>=len)printf("Yes\n");
}
for(int i=n.len-1;i>=0;i--){
printf("%d",n.d[i]);
}
return 0;
}
還是選擇換*2方式做:
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int num[10]={0};
struct node{
int d[25];
int len;
};
node change(char str[21],int len){
node n;
for(int i=0;i<len;i++){
n.d[len-i-1]=str[i]-'0';
}
return n;
}
node doubling(node n,int t,int len){
int carry=0,i;
node now;
for(i=0;i<len;i++){
int temp=carry+n.d[i]*t;
now.d[i]=temp%10;
carry=temp/10;
}
while(carry!=0){
now.d[i++]=carry%10;
carry/=10;
}
now.len=i;
return now;
}
bool judge(node n,node now,int len){
if(now.len!=len){
return false;
}else{
for(int i=0;i<len;i++){
num[n.d[i]]++;
num[now.d[i]]--;
}
for(int i=0;i<10;i++){
if(num[i]!=0){
return false;
}
}
return true;
}
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
char str[21];
scanf("%s",str);
int len=strlen(str);
node n=change(str,len);
node now=doubling(n,2,len);
bool flag=judge(n,now,len);
if(flag){
printf("Yes\n");
}else{
printf("No\n");
}
for(int i=now.len-1;i>=0;i--){
printf("%d",now.d[i]);
}
return 0;
}
對於大整數除法,詳見B1017,注意點:1、對於小於除數的數,需特判.2、做除法時,商由整除得到,餘由取餘得到.
B1017:
#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int carry=0;
struct node{
int d[1010];
int len;
node(){
memset(d,0,sizeof(d));
len=0;
}
};
node change(char a[1010],int len){
node n;
for(int i=0;i<len;i++){
n.d[i]=a[i]-'0';
}
n.len=len;
return n;
}
node division(node n,int b){
node now;
int len=n.len;
for(int i=0;i<len;i++){
int temp=n.d[i]+carry*10;
now.d[i]=temp/b; //注意點
carry=temp%b; //注意點
}
return now;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
bool flag=true;
char a[1010];
int b,len;
scanf("%s %d",a,&b);
len=strlen(a);
node n=change(a,len);
n=division(n,b);
for(int i=0;i<len;i++){
if(flag){
if(n.d[i]!=0){
flag=false;
printf("%d",n.d[i]);
}
}else{
printf("%d",n.d[i]);
}
}
if(flag)printf("0"); //注意點
printf(" %d",carry);
return 0;
}