Day 34 算法笔记之数学问题 5.6 大整数的运算(2)

目录

1.A/B

2.Have Fun with Numbers

3.Palindromic Numbers


1.A/B

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;
//建造结构体 
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-i-1] -'0';
	}
	return a;
}
//比较两数大小 
int compare(bign a,bign b){
	if(a.len>b.len) return 1;
	else if(a.len<b.len) return -1;
	else{
		for(int i=a.len-1;i>=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]<b.d[i]) return -1;
		}
		return 0;
	}
}


bign add(bign a,bign b){
	bign c;
	int carry = 0;
	for(int i=0;i<a.len||i<b.len;i++){
		int temp = a.d[i]+b.d[i]+carry;
		c.d[c.len++] = temp%10;
		carry = temp/10;
	}
	if(carry!=0){
		c.d[c.len++] = carry;
	}
	return c;
}

bign sub(bign a,bign b){
	bign c;
	for(int i=0;i<a.len||i<b.len;i++){
		if(a.d[i]<b.d[i]){
			a.d[i+1]--;
			a.d[i] += 10;
		}
		c.d[c.len++]= a.d[i]-b.d[i];
	}
	while(c.len>1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

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!=0){
		c.d[c.len++] = carry%10;
		carry/=10;
	}
	return c;
}

bign divide(bign a,int b){
	bign c;
	c.len=a.len;
	int r = 0;
	for(int i=a.len-1;i>=0;i--){
		int temp = a.d[i] + r * 10;
		if(temp<b){
			c.d[i] = 0;
			r+=a.d[i];
		}else{
			c.d[i] = temp/b;
			r=temp%b;
		}
	}
	
	while(c.len>1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

void print(bign a){
	printf("---------------------%d\n",a.len);
	for(int i=a.len-1;i>=0;i--){
		printf("%d",a.d[i]);
	}
}

int main(){
	
	char str1[1000];
	int n;
	scanf("%s %d",str1,&n);
	bign a = change(str1);
	print(divide(a,n));

	return 0;
}

2.Have Fun with Numbers

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;
//建造结构体 
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-i-1] -'0';
	}
	return a;
}
//比较两数大小 
int compare(bign a,bign b){
	if(a.len>b.len) return 1;
	else if(a.len<b.len) return -1;
	else{
		for(int i=a.len-1;i>=0;i--){
			if(a.d[i]>b.d[i]) return 1;
			else if(a.d[i]<b.d[i]) return -1;
		}
		return 0;
	}
}


bign add(bign a,bign b){
	bign c;
	int carry = 0;
	for(int i=0;i<a.len||i<b.len;i++){
		int temp = a.d[i]+b.d[i]+carry;
		c.d[c.len++] = temp%10;
		carry = temp/10;
	}
	if(carry!=0){
		c.d[c.len++] = carry;
	}
	return c;
}

bign sub(bign a,bign b){
	bign c;
	for(int i=0;i<a.len||i<b.len;i++){
		if(a.d[i]<b.d[i]){
			a.d[i+1]--;
			a.d[i] += 10;
		}
		c.d[c.len++]= a.d[i]-b.d[i];
	}
	while(c.len>1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

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!=0){
		c.d[c.len++] = carry%10;
		carry/=10;
	}
	return c;
}

bign divide(bign a,int b){
	bign c;
	c.len=a.len;
	int r = 0;
	for(int i=a.len-1;i>=0;i--){
		int temp = a.d[i] + r * 10;
		if(temp<b){
			c.d[i] = 0;
			r+=a.d[i];
		}else{
			c.d[i] = temp/b;
			r=temp%b;
		}
	}
	
	while(c.len>1&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}

void print(bign a){
	for(int i=a.len-1;i>=0;i--){
		printf("%d",a.d[i]);
	}
}

bool judge(bign a,bign b){
	if(a.len!=b.len) return false;
	int count[10] = {0};
	for(int i=0;i<a.len;i++){
		count[a.d[i]]++;
		count[b.d[i]]--;
	}
	for(int i=0;i<10;i++){
		if(count[i]!=0){
			return false;
		}
	}
	return true;
}

int main(){
	
	char str1[1000];
	gets(str1);
	bign a = change(str1);
	bign b = multi(a,2);
	if(judge(a,b)==true) printf("Yes\n");
	else printf("No\n");
	for(int i=b.len-1;i>=0;i--){
		printf("%d",b.d[i]);
	}

	return 0;
} 

3.Palindromic Numbers

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;
//建造结构体 
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-i-1] -'0';
	}
	return a;
}

bign add(bign a,bign b){
	bign c;
	int carry = 0;
	for(int i=0;i<a.len||i<b.len;i++){
		int temp = a.d[i]+b.d[i]+carry;
		c.d[c.len++] = temp%10;
		carry = temp/10;
	}
	if(carry!=0){
		c.d[c.len++] = carry;
	}
	return c;
}

void print(bign a){
	for(int i=a.len-1;i>=0;i--){
		printf("%d",a.d[i]);
	}
}

bool judge(bign a){
	for(int i=0;i<a.len/2;i++){
		if(a.d[i]!=a.d[a.len-i-1]) return false;
	}
	return true;
}

void find(bign a,int n){
	int times=1;
	if(judge(a)==true){
		print(a);
		printf(" ");
		printf("%d\n",times);
	}else{
		for(times;times<=n;times++){
			bign b=a;
			reverse(b.d,b.d+b.len);
			a= add(a,b);
			if(judge(a)==true){
				break;
			}
		}
		if(times>n) times--;
		print(a);
		printf(" %d\n",times);
		
	}
}


int main(){
	
	char str1[1010];
	int n;
	scanf("%s %d",str1,&n);
	bign a= change(str1);
	find(a,n);
	

	return 0;
}

猜你喜欢

转载自blog.csdn.net/aixiaoxiao13/article/details/121128799