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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,数据结构PAT习题中包含了关于树的题目。其中有一道题目将二叉树看作图,并对它作图的深度优先遍历,与原二叉树的结果是相同的。答案选项包括前序遍历、中序遍历、后序遍历和层次序遍历。 根据引用和引用,数据结构PAT习题还包含了测试各种排序算法的题目。这些题目旨在测试不同排序算法在不同数据情况下的表现。测试数据包括只有1个元素、11个不相同的整数、随机整数、顺序整数、逆序整数、基本有序的整数和随机正整数等。 综上所述,数据结构PAT习题涉及到树的遍历和排序算法的应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构习题-Dijkstra](https://download.csdn.net/download/li_guizhen/2853501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构(陈越)PAT习题 第七周:排序(上)](https://blog.csdn.net/ustcfdm/article/details/43671249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值