//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也是要要弄那个数组
分数 四则运算 注意化简的三条规则 输出的四条 ==双等判断 这些小细节