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 程序运行时间(!!!)
#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](https://i-blog.csdnimg.cn/blog_migrate/559136818b0147cdc88dea4615b865f1.png)
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);
}