PAT (Basic Level) 1021-1030

目录

1021 个位数统计

1022 D进制的A+B

1023 组个最小数

1024 科学计数法

1025 反转链表

1026程序运行时间

1027 打印沙漏

1028 人口普查

1029 旧键盘

1030 完美数列


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;  //查找对象--字符

结果:找到 -- 返回 第一个字符的索引;

http://www.cplusplus.com/

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hao123网址站ASP开源源码正式发布 本程序源码由hao123.com网址站独立开发,更新hao123最新样式和分类,asp版带后台,可全站生成静态页。 关于网站LOGO修改: 首页网站标志LOGO目录位置:/images/logo_140.gif 次页网站标志LOGO目录位置:/logo.gif 希望大家创建有自己特色的LOGO,以区别于hao123。 默认后台地址:/admin/login.asp 默认用户:admin 默认密码: admin 关于网站安装: 1, 上传源码,进入后台->全局->站点信息,把信息修改成你站信息 2, 生成首页和所有分类HTML 建议上传后修改默认管理后台地址/admin/的名称。 演式地址:http://www.86daijia.net 2012-5-16 增加站长统计程序及图标。 2012-5-16 美化界面。 2012-5-16 增加最新新闻资讯。 2012-5-16 修正后台管理全局设置不能保存BUG。 2012-4-9 增加IP购买页面。 2012-4-9 增加分享工具条。 2012-4-9 增加下角话费充值条 2012-4-9 支持二级目录,为站长节省空间 2012-2-27 再次与123同步 2011-11-7 新增折扣分类。 2011-10-24 同步hao123.com首页时间、天气的显示方式。 2011-10-14 新增实用工具、彩票、音乐、小游戏聚合分类。 2011-9-30 重新整理了分类。 2011-5-8 增加电影分类,自动调用wz123.net电影数据。修复军事、旅游、酷站链接名。 2011-4-2 增加连续剧分类,自动调用hao123.com连续剧数据。 2011-4-1 改进天气自动调用weather.com.cn数据。 2011-1-10 增加设计、微博分类,同步分类排序。 2011-1-10 同步天气预报数据,自动获取IP显示城市天气。 2010-11-8 增加笑话分类,同步分类排序。 2010-11-7 修改163与126邮箱登录自动跳转官网,修复子目录返回首页链接。 2010-10-20 最新同步团购分类。 2010-7-28 最新同步hao123.com清新绿风格。 2010-3-5 应广大站长需要,再次提供HTML版本下载, 2010-1-15 同步hao123分类顺序,最新更新wz123.net职业与爱好分类。 2010-1-11 最新修复网站放在子目录上栏目页样式问题,有此问题的用户请下载最新版覆盖修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值