A1023

該句話的意思模模糊糊,通過樣例才瞭解大概: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章