pat-复习08 大整数相加 分数运算部分

 

//1024  既然已经注意到是大整数相加了下面还用int 求和 to_string 这合适吗,不合适,数组也可以reverse 大整数相加千万不要在中途中再用整数赋值  否则大整数就白写了 
 #include<bits/stdc++.h>
 using namespace std;
 struct bign{
 	int d[1000];
 	int len;
 	bign(){
 		memset(d,0,sizeof(d));
 		len=0;
	 }
 };
 /*bign change(string a){
 	bign c;
 	c.len=a.size();
 	for(int i=0;i<a.size();i++){
 		c.d[i]=a[a.size()-1-i]-'0';//这里还是字符没有-'0' 
	 }
	 return c;
 }*/
 bign change(string a){

	bign c;

	c.len=a.size();

	for(int i=0;i<c.len;i++){

		c.d[c.len-1-i]=a[i]-'0';//没有减去'0'  没有化为整型 

	}

	return c;

}

/*bign add(bign a,bign b){
	bign c;
	int carry=0;
	for(int i=0;i<a.len||i<b.len;i++){//int i=0;i<a.len||b.len;i++     没写全应该是||i<b.len 
		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 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;

}
int main(){
	string a;
	int m;
	cin>>a>>m;
	int flag=1;
	for(int i=0;i<a.size()/2;i++){//<=
		if(a[a.size()-1-i]!=a[i]){
			flag=0;
			break;
		}
	}
	bign _1,_2,_3;
	if(flag==1){
		printf("%s\n%d",a.c_str(),0);
		return  0;
	} 
	int cnt=0; 
	 _1=change(a);
	while(flag==0&&cnt<m){//同一判断同一层,cnt=0先参与的判断则下面所有的是cnt=0层的而不是自增后的 
		flag=1;
		//没有重新赋值一直就这一个值 
		_2=_1;
		reverse(_1.d,_1.d+_1.len);
		 
		 _3=add(_1,_2);
		 //int temp;
		 //temp=0;
		 /*for(int i=0;i<_3.len;i++){
		 	 //temp=0; 求和累加不能来回初始化 
			 temp+=_3.d[i]*pow(10,i);//temp也有范围大整数根本表示不了  大整数题目不能再出现有一个整型变量去记值的情况 
		 }*/
		 //a=to_string(temp);
		cnt++;
		for(int i=0;i<_3.len/2;i++){//<=
			if(_3.d[i]!=_3.d[_3.len-1-i]){
				flag=0;
				break;
			}
		}
	_1=_3;	
	}

	for(int i=0;i<_3.len;i++){
		printf("%d",_3.d[_3.len-1-i]);
	}
	printf("\n");
	printf("%d",cnt);
	return 0;
}
/*
1236484566 100
*/ 
//1023 大整数 
#include<bits/stdc++.h>
using namespace std;
struct bign{
	int d[1000];
	int len;
	bign(){
		memset(d,0,sizeof(d));
		len=0;
	}
}; 
bign change(char a[]){
	bign c;
	c.len=strlen(a);
	for(int i=0;i<strlen(a);i++){
		c.d[c.len-1-i]=a[i]-'0';//又忘了仿佛失了智一样  2
	}
	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=carry/10;//这tm是什么玩意??今天没睡醒吗哥哈哈哈哈哈哈  3
	}
	return c;//有返回值函数总是忘记 
}
vector<int> book(10),book1(10);
//int book[10];
int main(){
	char _1[50];
	scanf("%s",&_1);//char型%d傻啦?   1
    //cin>>_1;
	bign _2,_3;
	_2=change(_1);
	for(int i=0;i<_2.len;i++){
		book[_2.d[i]]++;
	}
	_3=multi(_2,2);
	for(int i=0;i<_3.len;i++){
		book1[_3.d[i]]++;
	}
	if(book1==book){
		printf("Yes\n");
	}else {
		printf("No\n");
	}
	for(int i=0;i<_3.len;i++){
		printf("%d",_3.d[_3.len-1-i]);
	}
	return 0;
}
//最大公约数 
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	if(b==0) return a;
	else gcd(b,a%b);
}
int main(){
	int _1,_2,_3;
	scanf("%d%d",&_1,&_2);
	_3=gcd(_1,_2);
	cout<<_3;
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
struct fra{
	long long int up,down;
};
int gcd(int a1,int b1){
	if(b1==0){
		return a1;
	}
	else gcd(b1,a1%b1);
}
fra reduction(fra a){
	if(a.down<0){
		a.down=-a.down;
		a.up=-a.up;
	}
	if(a.up==0){//==写成=于以后干脆复制吧 
		a.down=1;
	}
	if(gcd(abs(a.up),abs(a.down) )!=1){//abs忘带 
		int temp= gcd(abs(a.up),abs(a.down));
		a.up=a.up/temp;//上面刚赋完值,下面有涉及到的要引参要的是变化前的 
		a.down=a.down/temp;//化简时gcd需要引参 否则上面赋值会影响下面gcd的运算 
	}
	return a;
}
fra add(fra a,fra b){
	fra c;
	c.up=a.up*b.down+a.down*b.up;
	c.down=a.down*b.down;
	return reduction(c);
}
fra sub(fra a,fra b){
	fra c;
	c.up=a.up*b.down-a.down*b.up;
	c.down=a.down*b.down;
	return reduction(c);
}
fra multi(fra a,fra b){
	fra c;
	c.up=a.up*b.up;
	c.down=a.down*b.down;
	return reduction(c);
}
fra divide(fra a,fra b){
	fra c;
	c.up=a.up*b.down;
	c.down=a.down*b.up;
	return reduction(c);
}
void show(fra a){
	if(a.down==1) printf("%lld",a.up);//= ?==
	else if(a.up==0) printf("%lld",0);
	else if(abs(a.up)>abs(a.down)) printf("%lld %lld/%lld",a.up/a.down,abs(a.up%a.down),a.down);
	else printf("%lld/%lld",a.up,a.down);
}
int main(){
	fra _1,_2;
	_1.up=3;
	_1.down=5;
	_2.up=4;
	_2.down=2;
	fra _3=add(_1,_2);
	show(_3);
	printf("\n");
	fra _4=sub(_1,_2);
	show(_4);
	printf("\n");
	fra _5=multi(_1,_2);
	show(_5);
	printf("\n");
	fra _6=divide(_1,_2);
    show(_6);
    printf("\n");
    return 0;
}
//1081 双等不能写成等于   gcd有引参  reduction 3种情况 show 4种情况 一开始求和的sum 上0下1 
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	if(b==0) return a;
	else gcd(b,a%b);
}
struct fra{
	int up,down;
}; 
fra reduction(fra a){
	if(a.up==0){
		a.down=1;
	}
	if(a.down<0){
		a.up=-a.up;
		a.down=-a.down;
	}
	if(gcd(abs(a.up),abs(a.down))!=1){
		int temp=gcd(abs(a.up),abs(a.down));
		a.up=a.up/temp;
		a.down=a.down/temp;
	}
	return a;
}
fra add(fra a,fra b){
	fra c;
	c.up=a.up*b.down+a.down*b.up;
	c.down=a.down*b.down;
	return reduction(c);
}
void show(fra a){
	if(a.up==0) printf("%d",0);
	else if(a.down==1) printf("%d",a.up);
	else if(abs(a.up>abs(a.down))){
		printf("%d %d/%d",a.up/a.down,abs(a.up)%a.down,a.down);
	}
	else printf("%d/%d",a.up,a.down);
}
int main(){
	int n;
	scanf("%d",&n);
	fra sum,_1;
	sum.up=0;
	sum.down=1;
	for(int i=0;i<n;i++){
		scanf("%d/%d",&_1.up,&_1.down);
		sum=add(sum,_1);
	}
	show(sum);
	return 0;
}

3道

总结

1024大整数相加 整体与结构不统一 虽然写了大整数但是 下面用了to_string 和int变量去赋值大整数导致实际上没用上大整数的错误 要用定义的数组 reverse也是要要弄那个数组

分数 四则运算 注意化简的三条规则 输出的四条  ==双等判断 这些小细节

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值