PAT乙级(部分)

15分

1001 一次AC

1006 换个格式输出整数

AC代码

#include<iostream>
#include<sstream>
using namespace std; 
int main()
{
	int n;
	cin>>n; 
	std::stringstream stream;
	std::string str;
	stream<<n;
	stream>>str;
	if(str.size()==3)
	{
		for(int i=0;i<str[0]-'0';i++)
		{ cout<<"B";}
		for(int i=0;i<str[1]-'0';i++)
		{ cout<<"S";}
		for(int i=1;i<=str[2]-'0';i++)
		{ cout<<i;}
	}
	else if(str.size()==2)
	{
		for(int i=0;i<str[0]-'0';i++)
		{ cout<<"S";}
		for(int i=1;i<=str[1]-'0';i++)
		{ cout<<i;}
	}
	else
	{
		for(int i=1;i<=str[0]-'0';i++)
		{ cout<<i;}
	}
}

1006思路与1002相同

1011 一次AC

注意long long 定义即可

1016 部分A+B

注意使用pow函数

逻辑上自己需弄清自己的思路

1021 一次AC

c++定义数组及初始化为"0"

C++中定义一个数组,没有绝对空的概念。

因为,定义数组后,系统就会给数组分配内存空间,该空间可能以前被其它程序使用过,其中留有原来写入的数据(对于本程序来说,就是垃圾数据),也可能没有被使用过,其内存数据值为0.

如果想在定义数组后,将数组内容清为0,则可以采用以下三种方法:

初始化为0
int  arr[10]={0};   //该语句置第一个元素为0,其余元素系统自动清为0.
手工逐个元素置0
int   arr[10];    //只定义,未初始化
for(int  i=0;i<10;i++ ) //采用循环遍历数组,逐位赋值为0
a[i]=0;
采用memset()函数置数组元素为0
#include <string.h> //memset()函数头文件`
int arr[10]; //只定义,未初始化
memset( arr, 0, sizeof(arr) );  //memset函数,将从arr开始的sizeof(arr)个字节置为0

1026 程序运行时间(!!!)

image-20211016185144846

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	int c1,c2;
	cin>>c1>>c2;
	int h,m,s;
	float c3=(c2-c1*1.0)/100;//c3=(c2-c1)/100;  错误,这样会导致c3为整数
	h=c3/3600;
	m=(c3-h*3600)/60;
	s=round(c3-h*3600-m*60);
	if(s==60)
	{
		m++;
		s=0;
	}
	if(m==60)
	{
		h++;
		m=0;
	}
	printf("%02d:%02d:%02d",h,m,s);
}
整型数字加减乘除还是整型,所以记得乘以1.00
四舍五入的函数为round(在math.h里面)
img

1031 查验身份证

数组定义及赋值

错误定义:“” 定义出为char型 却用int定义

int a[17]={“7”,“9”,“10”,“5”,“8”,“4”,“2”,“1”,“6”,“3”,“7”,“9”,“10”,“5”,“8”,“4”,“2”};

整型数组定义方法(无符号)

int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

字符数组定义方法(单字符 使用单引号)

char b[11]={‘1’,‘0’,‘X’,‘9’,‘8’,‘7’,‘6’,‘5’,‘4’,‘3’,‘2’};

字符串数组定义方法(使用双引号)

string a[10] = { “ling”,“yi”,“er”,“san”,“si”,“wu”,“liu”,“qi”,“ba”,“jiu”};

1036 一次AC 使用了round()函数

1041 一次AC 注意定义的结构体 还有各个值的类型

1046 一次AC 注意审题

1051注意最后两个测试点

AC代码 注意注释内容

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	double r1,p1,r2,p2;
	cin>>r1>>p1>>r2>>p2;
	double a,b,c,d;
	a=r1*cos(p1);
	b=r1*sin(p1);
	c=r2*cos(p2);
	d=r2*sin(p2);
	double A,B;
	A=a*c-b*d;
	B=a*d+b*c;
	if(abs(A)<0.005&&abs(B)<0.005) cout<<"0";
    else
    {
      if(abs(A)<0.005) cout<<"0.00";        //如果浮点数足够小,则认为是0,此为倒数第一点错处
      else { printf("%.2f",A);
	  }
      if(B<-0.05)                //对于此题来说,负数不是小于零的,此为倒数第二个测试点错处
      {
          cout<<"-";
          B=-B;
      }
      else cout<<"+";
      if(abs(B)<0.005) cout<<"0.00i";   //如果浮点数足够小,则认为是0,此为倒数第一点错处
      else {
      	printf("%.2fi",B);
	  }
    }
 
    return 0;
 } 

绝对值函数abs() 头文件cmath

1056 一次AC

两次for循环 注意逻辑

1061 一次AC

注意回溯 sum=0

1066 图像过滤

AC代码

#include<iostream>
using namespace std;
int main()
{
	int m,n,a,b;
	int x;
	cin>>m>>n>>a>>b>>x;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			int N;
			scanf("%d",&N);
            //这里用cin会造成超时
			if(N>=a && N<=b) N=x;
			printf("%03d",N);
			if(j!=n-1) cout<<" ";
		}
		if(i!=m-1) cout<<endl;
	}
 } 

如何解决c++中cin的输入缓慢问题

用cin与cout实际上比printf与scanf要慢,在大量的输入输出时就会造成时间的浪费!!!

ios::sync_with_stdio(false);

用这样的一行代码可以消除这样的问题。但这题不行 涉及输出000 这样有的输出不了

1071 注意逻辑及答案格式

1076 错误原因

[Error] ISO C++ forbids comparison between pointer and integer [-fpermiss
错误代码:
if(a[i]=="G"&&b[i]!="C")
    return false; 
改正后的代码:
if(a[i]=='G'&&b[i]!='C')
    return false;
//解释:两种不同类型的数据不能做比较,a[i]表示的是一个字符,“C”表示的是一个字符串的收地址,所以应该把“C”改为‘C’

1081 错误原因

这道题中容易迷惑且想不到的是输入问题,题中虽说是非空字符串,但是并没有说密码中不能输入空格,虽然输入也是错的。所以就不能用平时的char数组,因为它以%s直接输入字符串时是以空格作为结束输入字符串的标志,此时就需要用到getline(cin,s)这个函数,它就可以包含空格,以回车作为输入结束的标志,但是在输入之前先用getchar()吸收输入N之后的回车

1086 二次AC

错误原因 倒序后有前置0

stoi()函数: 将 n 进制的字符串转化为十进制

 stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制
 //头文件#include<string>
  示例:
 stoi(str, 0, 2); //将字符串 str 从 0 位置开始到末尾的 2 进制转换为十进制

1091 几个错误点

思路问题

正面相乘不行 应转变求余(且是输入数的即用一个函数给他放大位数)

flag标志数问题

应用局部变量 因为for里break之后flag即为0 什么也输出不了

20分

1002 写出这个数

AC代码

#include <iostream> 
#include<sstream>
using namespace std;

int main(){
	string n;
	cin >> n;
	int num = 0;
	for (int i = 0; i < n.size(); i++) {
		num += n[i] - '0';
	}
	string a[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	std::stringstream stream;
	std::string ss;
	stream << num;
	stream >> ss;
	for (int j = 0; j < ss.size(); j++)
	{
		
		cout << a[ss[j] - '0'] ;
		if (j != ss.size() - 1) cout << " ";
	}
	return 0;
}
//尤其注意string a[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
//第一次未AC为数组定义问题

整型等形式转为字符串输出

1.sstream(推荐做法)

stringstream通常是用来做数据转换的。

相比c库的转换,它更加安全,自动和直接。

例子一:基本数据类型转换例子 int转string

#include <string>
#include <sstream>
#include <iostream> 

int main()
{
    std::stringstream stream;
    std::string result;
    int i = 1000;
    stream << i; //将int输入流
    stream >> result; //从stream中抽取前面插入的int值
    std::cout << result << std::endl; // print the string "1000"
} 

例子二:除了基本类型的转换,也支持char *的转换。

#include <sstream>
#include <iostream> 

int main()
{
    std::stringstream stream;
    char result[8] ;
    stream << 8888; //向stream中插入8888
    stream >> result; //抽取stream中的值到result
    std::cout << result << std::endl; // 屏幕显示 "8888"
} 

例子三:再进行多次转换的时候,必须调用stringstream的成员函数clear().

#include <sstream>
#include <iostream>
int main()
{
    std::stringstream stream;
    int first, second;
    stream<< "456"; //插入字符串
    stream >> first; //转换成int
    std::cout << first << std::endl;
    stream.clear(); //在进行多次转换前,必须清除stream
    stream << true; //插入bool值
    stream >> second; //提取出int
    std::cout << second << std::endl;
} 
运行clear的结果
003

没有运行clear的结果
004
2.整数转为字符串 itoa ()函数

itoa()原型: char *itoa( int value, char *string,int radix);

原型说明:

输入参数:

value:要转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。

功能:将整数value 转换成字符串存入string 指向的内存空间 ,radix 为转换时所用基数(保存到字符串中的数据的进制基数)。

返回值:函数返回一个指向 str,无错误返回。

注意:itoa不是一个标准的c函数,他是windows特有的,跨平台写程序,要用sprintf。

# include <stdio. h>
# include <stdlib. h>
void main (void);
void main (void)
{
    int num = 100;
    char str[25];
    itoa(num, str, 10);
    printf("The number 'num' is %d and the string 'str' is %s. \n" ,
                       num, str);
}

1003(!!!) 锻炼数学思维

这题难点就是数学思维的思辨 需推出a*b==c 然后顺着往下定义敲代码即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bwywb_3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值