1002 写出这个数
c++ 数字和字符串的转换
法一:利用 stringstream:添加头文件 #include
-
数字转字符串
#include <string> #include <sstream> int main(){ double a = 123.32; string res; stringstream ss; //定义流ss ss << a; //将数字a转化成流ss ss >> res; //将流ss转化成字符串 return 0; }
-
字符串转数字
#include <string> #include <sstream> int main(){ double a ; string res= "123.32"; stringstream ss; ss << res; ss >> a; return 0; } //此处包装了一个方法,将一位的数字转化成两位的字符串 //0->"00" 1->''01" string transform(int num) { string res; stringstream ss; ss<<num; ss>>res; if(num<10){ res="0"+res; } return res; }
法二:利用 sprintf() 函数和 sscanf() 函数
-
sprintf() 用于将数字转化为字符串
\#include <iostream> \#include <string> using namespace std; int main() { char str[10]; int a=1234321; //将整数转化为字符串 sprintf(str,"%d",a); int len=strlen(str); cout<<"字符串"<<str<<endl; cout<<"长度"<<len<<endl; char str1[10]; double b=123.321; //将浮点数转化为字符串 sprintf(str1,"%.3lf",b); int len1=strlen(str1); cout<<"字符串"<<str1<<endl; cout<<"长度"<<len1<<endl; return 0; }
-
sscanf() 用于将字符串转化为数字
#include <iostream> #include <string> using namespace std; int main() { char str[]="1234321"; int a; sscanf(str,"%d",&a); cout<<a<<endl; char str1[]="123.321"; double b; sscanf(str1,"%lf",&b); cout<<b<<endl; return 0; }
1003 我要通过!
坑:注意输入字符串为空或字符串长度小于3的情况!!!
1004 成绩排名
如果在C++中,用cin>>str;
这种方法来接收字符串那么录入的str不能包含空格,否则它会按照空格将整个字符串切分成若干段。如果想输入带空格的字符串就要用到getline()这个函数。
1007 素数对猜想
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。50以内的素数:2、3、5、7、11、13、17、19、23、29、31、37、41 、43、47。
一个数,如果有因子的话,那么在它的平方根数以内就应该有,否则就没有因子。所以必定有一个因子不大于m的平方根。故判断m是否为素数,只要试除到m的平方根就可以了,不必一直到m-1。
总结:关键在于判断是不是素数的代码段可以作为常识记忆。
bool isPrime2(int n){
bool yes=true;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
yes=false;
break;
}
}
return yes;
}
1008 数组元素循环右移问题
坑点:不要想当然地认为N>M,所以在M>N时需要对M进行处理,即作取余计算M=M%N。
1009 说反话
c++输入问题——输入回车判断当前输入结束:
while (cin >> s) {
cout << s << endl;
vec.push_back(s);
if (cin.get() == '\n') //
break;
}
1010 一元多项式求导
- 特判0 0 。
- 结尾不输出空格。
1011 A+B 和 C
- C++中,int占用4字节,32比特,数据范围为-2 147 483 648~2 147 483 647[-231~231-1]。int占用2字节,16比特,数据范围为-3276832767[-2^152^15-1]。
- 2^31 = 2 147 483 648,需要使用长整型 long。
1013 数素数
正确思路应该是先把第1个第10000个素数找出来存入数组中,而不是在确定素数的循环中就去判断他是不是第m第n个之间。
1015 德才论
-
定义结构体数组:
struct info { string num; int de; int cai; int sum; int cla; //类别 }stu[100001];
-
给结构体数组排序:
//自定义排序规则 bool cmp(info a, info b) { if (a.cla != b.cla) return a.cla < b.cla; else if (a.sum != b.sum) return a.sum > b.sum; else if (a.de != b.de) return a.de > b.de; else return a.num < b.num; } sort(stu, stu + N, cmp);
1019 数字黑洞
数字前加0:
#include <iostream>
using namespace std;
void main()
{
int hour=9;
char acHour[8]={0};
sprintf(acHour, "%02d", hour);
cout<<acHour;
}
1019 数字黑洞
C++给string字符串排序:利用sort(s.begin(),s.end());
1020 月饼
坑:需求有可能大于库存。
1022 D进制的A+B
坑:需要考虑A+B=0的情况。
注意:定义数组时可以稍微大一些,否则容易报数组越界的错误。
1023 组个最小数
疑问:为什么使用INT_MAX会报错??
1024 科学计数法
C++输出时保留2位小数关键代码:
#include <iomanip>
cout << setiosflags(ios::fixed) << setprecision(2);
cout << 1.23565 << endl;
1026 程序运行时间
取整函数:
- floor——不大于自变量的最大整数
- ceil——不小于自变量的最大整数
- round——四舍五入到最邻近的整数
1028 人口普查
坑:当有效值为0时,只输出0,不输出姓名,姓名为空也是不可以的。
1029 旧键盘
unordered_set打印输出代码:
#include <unordered_set>
unordered_set<char> wrong;
for (auto iter = wrong.begin(); iter != wrong.end(); iter++)
cout << *iter;
1033 旧键盘打字
坑:可能旧键盘上没有一个键是坏的,所以第一行是空的,所以应该用getline(cin,s)去输入字符串而不是用cin。
1034 有理数四则运算
坑:测点2不通过。因为两个int进行加减乘除后可能超过int最大范围,所有数据使用long long int类型(long long)即可。
注意:在进行除法运算时,有可能出现分母为负的情况,因此代码与加减乘有所不同:
simplify(a, b); cout << " / "; simplify(c, d); cout << " = ";
if (c > 0)
simplify(a * d, b * c);
else if (c < 0)
simplify((-1) * a * d, abs(b * c));
else
cout << "Inf";
cout << endl;
1041 考试座位号
map按值排序:
//map按值排序
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef pair<string, int> PAIR;
int cmp(const PAIR& x, const PAIR& y)//针对PAIR的比较函数
{
return x.second > y.second; //从大到小
}
int main() {
map<string,int> nmap;
nmap["LiMin"] = 90;
nmap["ZiLinMi"] = 79;
nmap["BoB"] = 92;
nmap.insert(make_pair("Bing",99));
nmap.insert(make_pair("Albert",86));
//把map中元素转存到vector中
vector<PAIR> vec(nmap.begin(),nmap.end());
sort(vec.begin(), vec.end(), cmp); //排序
for (size_t i = 0; i != vec.size(); ++i) { //输出
cout << vec[i].first <<" "<<vec[i].second<<endl;
}
return 0;
}
1044 火星数字
坑:
- 数字0对应火星文的长度不是3,而是4(“tret”)。
- 火星文进位没有0,比如26 输入的是 hel 而不是hel tret.(13的整数倍时,后面的输出不带’tret’。)
- 代码中如果先输入cin,再在其后遍历输入getline会导致少读入一行,因为cin遇到\n会停下来,导致第一行的换行符没有被读入。因此,若在前面使用了cin,需要在使用getline前加一行
getchar();
,或者使用scanf("%d\n",&n);