PAT大整數
阿新 • • 發佈:2021-02-07
技術標籤:PAT甲級試題
大整數加法
#include<iostream> #include<string.h> using namespace std; const int maxn=10010; struct bign{ int d[maxn]; int len; bign(){//建構函式用來初始化結構體的函式 memset(d,0,sizeof(0));//對陣列初始化為0,使用memset需要新增標頭檔案string len=0; } }; bign change(char str[])//將整數轉化為bign { bign a; a.len=strlen(str); for(int i=0;i<a.len;i++) { a.d[i]=str[a.len-1-i]-'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) { c.d[c.len++]=carry; } return c; } void print(bign a) { for(int i=0;i<a.len;i++) { cout<<a.d[i]; } } int main() { char s1[maxn],s2[maxn]; cin>>s1>>s2; bign a=change(s1); bign b=change(s2); print(add(a,b)); return 0; }
1023 Have Fun with Numbers (20 分)
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { string s; vector<int>a; cin>>s; for(int i=s.size()-1;i>=0;i--)//逆向儲存 { a.push_back(s[i]-'0');//存到陣列中 } vector<int>b; int t=0;//進位 for(int i=0;i<a.size();i++) { int sum=a[i]+a[i]+t; b.push_back(sum%10);//個位數存到陣列中 t=sum/10;//十位數作為新的進位 } if(t)b.push_back(t); vector<int>c = b;//把b陣列賦值給c陣列 sort(a.begin(),a.end());//陣列從大到小排序 sort(c.begin(),c.end()); if(a==c)puts("Yes"); else puts("No"); for(int i=b.size()-1;i>=0;i--)//輸出最後的結果 { cout<<b[i]; } return 0; }
1024 Palindromic Number (25 分)
* 對於vector<int>的初始化又掌握了一下 * vector<int> a 初始化為空 * vector<int> a(n)開一個長度為n的vector陣列預設值為0 * vector<int> a(n, x)開一個長度為n的vector陣列預設全都為x * vector<int> a(b)等價於把vector<int> b的陣列拷貝到a中前提a和b必須是同類型的 * vector<int> a(b.begin() + x, b.end() - y) 把b中的一段數拷貝到a中 begin() + x <= end() - y; 如果想實現倒著放的話可以使用rbegin(), rend() b.rbegin() 等價於 b.end() - 1 b.rend() 等價於 b.begin() - 1
#include <iostream>
#include <vector>
using namespace std;
bool check(vector<int>& num)//判斷是否是迴文數
{
for (int i = 0, j = num.size() - 1; i < j; i ++, j -- )
if (num[i] != num[j])
return false;
return true;
}
vector<int> add(vector<int>& a, vector<int>& b)//兩個數相加
{
vector<int> c;
for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i ++ )
{
int s = t;
if (i < a.size()) s += a[i];
if (i < b.size()) s += b[i];
c.push_back(s % 10);
t = s / 10;
}
return c;
}
int main()
{
string n;
int k;
cin >> n >> k;
vector<int> a;
for (int i = n.size() - 1; i >= 0; i -- )
{
a.push_back(n[i] - '0');
}
int count = 0;//次數
if (!check(a))//若不是迴文數
{
while (count < k)
{
vector<int> b(a.rbegin(), a.rend());//將b陣列中的資料逆轉
a = add(a, b);//兩個數相加後結果賦值給a
count ++ ;
if (check(a)) break;//如果是迴文數則退出
}
}
for (int i = a.size() - 1; i >= 0; i -- )
{
cout << a[i];//輸出
}
cout << endl;
cout << count << endl;
return 0;
}