//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也是要要弄那個陣列
分數 四則運算 注意化簡的三條規則 輸出的四條 ==雙等判斷 這些小細節

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260332.html
標籤:其他
上一篇:C++插入排序
