目录
1021 个位数统计
水题。
#include<iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int a[10]={0};
for(auto x:s)
a[x-'0']++;
for(int i=0;i<10;i++)
{
if(a[i]!=0)
cout<<i<<":"<<a[i]<<endl;
}
}
1022 D进制的A+B
除基取余法;
用栈存储余数,再输出;
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int a,b,D;
cin>>a>>b>>D;
int sum=a+b;
stack<int> s;
int r;//remainder余数
do
{
r=sum%D;
s.push(r);
sum=sum/D;
}while(sum!=0);
while(!s.empty())
{
cout<<s.top();
s.pop();
}
return 0;
}
1023 组个最小数
水题,先输出最小的非零整数,然后从小到大输出数组中的数即可。
#include<iostream>
using namespace std;
int main()
{
int a[10]={0};
for(int i=0;i<10;i++)
cin>>a[i];
for(int i=1;i<10;i++)
{
if(a[i]!=0)
{
a[i]--;
cout<<i;
break;
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<a[i];j++)
cout<<i;
}
return 0;
}
1024 科学计数法
(1)substr()有2种用法:
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567";
(2)string中 find()的应用 (rfind() 类似,只是从反向查找)
原型如下:
(1)size_t find (const string& str, size_t pos = 0) const; //查找对象--string类对象
(2)size_t find (const char* s, size_t pos = 0) const; //查找对象--字符串
(3)size_t find (const char* s, size_t pos, size_t n) const; //查找对象--字符串的前n个字符
(4)size_t find (char c, size_t pos = 0) const; //查找对象--字符
结果:找到 -- 返回 第一个字符的索引;
(3)abs()返回参数的绝对值;
(4)从一位答主那里得到的经验:尽量使用string或char*来进行存储, 使用整型变量存储很可能漏掉前导零。 如: +3.00001E-3这组数据。https://zhanglong.blog.csdn.net/article/details/110319543
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cin>>s;
int i=s.find('E');
string ss=s.substr(1,i-1);
int n=stoi(s.substr(i+1));
if(s[0]=='-')
cout<<"-";
if(n<0)//指数为负,小数点左移
{
cout<<"0.";
for(int i=0;i<abs(n)-1;i++)
cout<<"0";
for(auto x:ss)
if(x!='.')
cout<<x;
}
else
{
cout<<ss[0];
int cnt,j;
for(cnt=0,j=2;cnt<n&&j<ss.length();j++,cnt++)
cout<<ss[j];
if(j==ss.length())//j走完了,n没走完,补零
{
for(int i=0;i<n-cnt;i++)
cout<<0;
}
else
{
cout<<'.';//先输出个小数点
for(int k= j;k<ss.length();k++)
cout<<ss[k];
}
}
}
1025 反转链表
(1)因为地址要补零,用printf输出;
(2)根据其他题解的参考把数组长度由100000改成了100005。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int first,k,n,temp;
cin>>first>>n>>k;
//int list[100000],data[100000],next[100000];
int list[100005],data[100005],next[100005];
for(int i=0;i<n;i++)
{
cin>>temp;//address
cin>>data[temp]>>next[temp];//address作为下标
}
int sum=0;
while(first!=-1)
{
list[sum++]=first;
first=next[first];
}
auto it=begin(list);
for(int i=0;i<sum/k;i++)
{
reverse(it+k*i,it+k*i+k);
}
for(int i=0;i<sum-1;i++)
printf("%05d %d %05d\n",list[i],data[list[i]],list[i+1]);
printf("%05d %d -1",list[sum-1],data[list[sum-1]]);
}
1026程序运行时间
(1)cmath头中的四舍五入函数round(),帮忙取到最近的整数;
(2)输出要补零,图方便就参考了别人的写法用了printf %02d;
(3)奇怪的地方是,如果第8行直接写 double time=(c2-c1)/100;测试点1会有错误,没搞明白。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int c1,c2; cin>>c1>>c2;
double time=c2-c1;
time=time/100;
int t=round(time);//四舍五入函数
printf("%02d:%02d:%02d",t/3600,(t%3600)/60,t%60);
return 0;
}
补充一个答主手写了四舍五入函数的题解链接:https://zhanglong.blog.csdn.net/article/details/110456847
1027 打印沙漏
感觉填充容器那段写好就很好做了。
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
int main()
{
int sum,row,remain=0;
char c;
cin>>sum>>c;
row=(int)sqrt((sum+1)/2);//半部分行数
remain=sum-2*row*row+1;//剩余符号数
int space=0;//每行空格数,初始值为第一行
int cNum=2*row-1;//每行字符数,初始值为第一行
vector<string> v;
for(int i=0;i<row;i++)
{
string s="";//null
for(int i=0;i<space;i++)
s+=" ";//加空格
for(int i=0;i<cNum;i++)
s+=c;
space+=1;//下一行开头空格数加一
cNum-=2;//下一行沙漏字符数减二
v.push_back(s);
}
//先正序输出再逆序输出
for(auto x:v)
cout<<x<<endl;
v.pop_back();
reverse(v.begin(),v.end());
for(auto x:v)
cout<<x<<endl;
cout<<remain;
}
1028 人口普查
(1)用好容器存储和sort()函数,要注意的是写一个bool函数判定输入年龄是否合法,只存储合法的;
(2)若没有72行那一段代码,测试点3会发生段错误,因为假设所有的输入均不合法,那么容器为空,对容器的back()、front()的访问就导致了段错误,遇到段错误可以往边界值方向考虑解决。
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
struct people
{
string name;
int year,month,date;
};
bool cmp(people a,people b)//年龄升序
{
if(a.year!=b.year)
return a.year>b.year;
else if(a.month!=b.month)
return a.month>b.month;
else
return a.date>b.date;
}
bool exist(people a)
{
//超过两百岁的
if(a.year<1814)
return false;
else if(a.year==1814)
{
if(a.month<9)
return false;
else if(a.month==9)
{
if(a.date<6)
return false;
}
}
//没出生的
if(a.year>2014)
return false;
else if(a.year==2014)
{
if(a.month>9)
return false;
else if(a.month==9)
{
if(a.date>6)
return false;
}
}
return true;
}
int main()
{
vector<people> v;
int n;
cin>>n;
while(n--)
{
people temp;
cin>>temp.name;
scanf("%d/%d/%d",&temp.year,&temp.month,&temp.date);
if(exist(temp))
v.push_back(temp);
}
sort(v.begin(),v.end(),cmp);
if(v.size()==0)
{
cout<<0;
return 0;
}
cout<<v.size()<<" "<<v.back().name<<" "<<v.front().name;
return 0;
}
另外贴一段其他博主写的16行AC代码,也很好:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, num = 0; cin >> n;
string s1, s2, min_y = "9", max_y = "0", min_n, max_n;
while(n--) {
cin >> s1 >>s2;
if(!(s2 >= "1814/09/06" && s2 <= "2014/09/06")) continue;
num++;
if(min_y > s2) { min_y = s2; min_n = s1; }
if(max_y < s2) { max_y = s2; max_n = s1; }
}
cout << num;
if(num) cout << ' ' << min_n << ' ' << max_n << '\n';
return 0;
}
1029 旧键盘
(1)find()如果在字符串中没有找到参数就会返回string::npos;
(2)toupper()函数把字符串中小写字母换成大写。
#include<iostream>
using namespace std;
int main()
{
string s1,s2,s3="";
cin>>s1>>s2;
for(auto x:s1)
{
if(s2.find(x)==string::npos&&s3.find(toupper(x))==string::npos)
s3+=toupper(x);
}
cout<<s3;
}
1030 完美数列
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int N;
long long p;
cin>>N>>p;
int length=0,result=0;
vector<long long> v(N);//若类型为int,测试点5不通过
for(int i=0;i<N;i++)
cin>>v[i];
sort(v.begin(),v.end());//升序
for(int i=0;i<N;i++)
for(int j=i+result;j<N;j++)
{
if(v[i]*p>=v[j])//判定满足
{
length=j-i+1;
if(length>result)
result=length;
}
else
break;//以此开头的无法再加长,开头右移
}
cout<<result;
}