1. 程式人生 > 其它 >PAT大整數

PAT大整數

技術標籤: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 分)

1501. 迴文數

* 對於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;
}