PAT记录
来源:互联网 发布:拆分资金盘 php源码 编辑:程序博客网 时间:2024/05/29 04:53
2-05. 求集合数据的均方差
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
设计函数求N个给定整数的均方差。若将N个数A[]的平均值记为Avg,则均方差计算公式为:
输入格式说明:
第1行输入正整数N(<=10000),第2行输入N个整数。
输出格式说明:
输出这N个数的均方差,要求固定精度输出小数点后5位。
样例输入与输出:
序号 输入 输出
1 10
6 3 7 1 4 8 2 9 11 5
3.03974
2 1
2
0.00000
#include <iostream>#include<math.h>#include<malloc.h>using namespace std;int main() {// your code goes hereint N=0,n=0;cin>>N;n=N;float sum=0;int *a=(int *)malloc(sizeof(int)*N);while(n--){int temp=0;cin>>temp;sum+=temp;a[n]=temp;}int i;sum=0;float average=sum/N;for(i=0;i<N;i++){sum+=((a[i]-average)*(a[i]-average))/N;}sum=sqrt(sum);printf("%.5f",sum);system("pause");return 0;}
2-06. 数列求和
给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *…*pm ^km。
输入格式说明:
输入long int范围内的正整数N。
输出格式说明:
按给定格式输出N的素因式分解表达式,即 N = p1^k1 * p2^k2 *…*pm ^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki==1即因子pi只有一个时不输出ki。
样例输入与输出:
序号输入输出11024
1024=2^102
1323
1323=3^3*7^23
97532468
97532468=2^2*11*17*101*12914
1
1=15
3
3=3
解法:
#include <iostream>#include<string.h>using namespace std;int ans[200000];int N=0;int A;void BigDecim_Add(int a[],int i){int temp=a[i]+(A)*(N-i);a[i]=temp%10;a[i+1]=temp/10;}int main() {// your code goes herememset(ans,0,sizeof(ans));cin>>A>>N;if(N>0){int i=0;int j=0;for(i=0;i<N;i++){BigDecim_Add(ans,i);//相加}//int len3=strlen(ans);bool flag_start=false;for(i=N+1;i>=0;i--){if(flag_start)printf("%d",ans[i]);else if(ans[i]){printf("%d",ans[i]);flag_start=true;}}}else cout<<0;//0位system("pause");return 0;}
2-07. 素因子分解
给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *…*pm ^km。
输入格式说明:
输入long int范围内的正整数N。
输出格式说明:
按给定格式输出N的素因式分解表达式,即 N = p1^k1 * p2^k2 *…*pm ^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki==1即因子pi只有一个时不输出ki。
样例输入与输出:
序号输入输出11024
1024=2^102
1323
1323=3^3*7^23
97532468
97532468=2^2*11*17*101*12914
1
1=15
3
3=3
#include <iostream>using namespace std;int main() {// your code goes here int num; int flag=0; int cnt=0; cin>>num; cout<<num<<"="; if(num>1) { for(int i = 2; i<= num; i++) { while (num % i == 0) { if(flag==1) cout<<"*";//第一遍不输出*号 cnt++;//判断相同素因子的个数,例如12=2*2*3。即12的素因子2有两个 num /= i; } if(cnt!=0) { flag=1; if(cnt>1) cout<<i<<"^"<<cnt;//输出 else //1次幂不输出 cout<<i; } cnt=0; } } else cout<<1;
return 0;}
3-07. 求前缀表达式的值
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
序号输入输出1
+ + 2 * 3 - 7 4 / 8 4
13.02
/ -25 + * - 2 3 4 / 8 4
12.53
/ 5 + * - 2 3 4 / 8 2
ERROR4
+10.23
10.2
#include<iostream>#include<math.h>using namespace std;bool Error_flag=false;double exp(){ char a[50]; scanf("%s",a); int len=strlen(a); if(len==1) { switch(a[0]){ case '+':return exp()+exp(); case '-':return exp()-exp(); case '*':return exp()*exp(); case '/': { double temp1=0,temp2=0; temp1=exp(); temp2=exp(); if(temp2!=0) return temp1/temp2; else { Error_flag=true; return 0; } } default:return atof(a); } }else return atof(a);}int main(){double ans;char b[10];ans=exp();if(!Error_flag)printf("%.1f",ans);elsecout<<"ERROR";system("pause");return 0;}
5-05. QQ帐户的申请与登陆
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
输入格式说明:
输入首先给出一个正整数N(<=105),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。
输出格式说明:
针对每条指令,给出相应的信息:
1) 若新申请帐户成功,则输出“New: OK”;
2) 若新申请的号码已经存在,则输出“ERROR: Exist”;
3) 若老帐户登陆成功,则输出“Login: OK”;
4) 若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5) 若老帐户密码错误,则输出“ERROR: Wrong PW”。
样例输入与输出:
序号输入输出15L 1234567890 myQQ@qq.comN 1234567890 myQQ@qq.comN 1234567890 myQQ@qq.comL 1234567890 myQQ@qqL 1234567890 myQQ@qq.com
ERROR: Not ExistNew: OKERROR: ExistERROR: Wrong PWLogin: OK
#include<iostream>#include<map>#include<string>using namespace std;map<long int ,string> m;int main(){int n=0;char order;long int count;string pass;cin>>n;map<long int,string>::iterator lit;while(n--){ // order=getchar();//获取命令字符cin>>order; if(order=='N'){ cin>>count>>pass; lit=m.find(count); if(lit==m.end()) { m[count]=pass; cout<<"New: OK"<<endl;//创建成功 } else cout<<"ERROR: Exist"<<endl;//已经存在}else { cin>>count>>pass; lit=m.find(count); if(lit==m.end()) cout<<"ERROR: Not Exist"<<endl;//不存在帐号 else { string pass_=m[count];if(pass_==pass) cout<<"Login: OK"<<endl; else cout<<"ERROR: Wrong PW"<<endl; } }}system("pause"); return 0;}
水题,注意地图的用法就很简单。
4-07. 修理牧场
农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。
但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
请编写程序帮助农夫计算将木头锯成N块的最少花费。
输入格式说明:
输入首先给出正整数N(<=104),表示要将木头锯成N块。第2行给出N个正整数(<=50),表示每段木块的长度。
输出格式说明:
输出一个整数,即将木头锯成N块的最少花费。
样例输入与输出:
序号输入输出184 5 1 2 1 3 1 1
492
11
0
#include<iostream>#include<list>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> > que;int main(){int n=0;int sum=0;int cnt=0;cin>>n;while(n--){int temp=0;scanf("%d",&temp); que.push(temp);} while(que.size()!=1){ int a=que.top(); que.pop(); int b=que.top(); que.pop();sum+=(a+b);que.push(a+b);}cout<<sum;system("pause");return 0;}
水题:注意priority_queue的用法就很简单。
6-07. 哈利·波特的考试
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。
现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问你:带什么动物去可以让最难变的那种动物(即该动物变为哈利·波特自己带去的动物所需要的魔咒最长)需要的魔咒最短?例如:如果只有猫、鼠、鱼,则显然哈利·波特应该带鼠去,因为鼠变成另外两种动物都只需要念4个字符;而如果带猫去,则至少需要念6个字符才能把猫变成鱼;同理,带鱼去也不是最好的选择。
输入格式说明:
输入说明:输入第1行给出两个正整数N(<=100)和M,其中N是考试涉及的动物总数,M是用于直接变形的魔咒条数。为简单起见,我们将动物按1~N编号。随后M行,每行给出了3个正整数,分别是两种动物的编号、以及它们之间变形需要的魔咒的长度(<=100),数字之间用空格分隔。
输出格式说明:
输出哈利·波特应该带去考场的动物的编号、以及最长的变形魔咒的长度,中间以空格分隔。如果只带1只动物是不可能完成所有变形要求的,则输出0。如果有若干只动物都可以备选,则输出编号最小的那只。
样例输入与输出:
序号输入输出16 113 4 701 2 15 4 502 6 505 6 601 3 704 6 603 6 805 1 1002 4 605 2 80
4 702
5 45 4 21 2 42 3 41 3 6
0
#include<iostream>using namespace std;#define inf 1200int a[101][101]={0};int cnt=0;int ans_val=1200;int ans_p=0;void djs(int k, int N)//求第k个点的djst算法{ int dis[101]; int i=0; int j=0;for( i=1;i<=N;i++) dis[i]=a[k][i];//初始化数组dis[k]=0;int visit[101]={0};//初始化标记数组int min=inf;int min_cnt=k;visit[k]=1;//原始节点for( j=0;j<N;j++){min=inf;for(i=1;i<=N;i++){if(dis[i]<min&&(visit[i]==0)){min=dis[i];//记录距离min_cnt=i;//记录点}}if(min_cnt==k) break;visit[min_cnt]=1;//找到最短路径的点 并记录for(i=1;i<=N;i++)//遍历其他点 更新他们的权值{ // if(i!=k)if((a[min_cnt][i]!=inf)&&(dis[i]>min+a[min_cnt][i]))dis[i]=min+a[min_cnt][i];}}int max=0;//找最大值for(i=1;i<=N;i++){ //if(i!=k)if(dis[i]>max)max=dis[i];} //本节点到其余个节点的路径长的最大值 较 其它点到其余个点路径长最大值 较小 if(max<ans_val) {ans_val=max;ans_p=k;}}int main(){int N=0,M=0;int i=0,j=0,temp=0;cin>>N>>M;//N poins M rulesfor(int h=1;h<=N;h++)for(int p=1;p<=N;p++)a[h][p]=inf;//memset(a,102,sizeof(int)*10000);//初始化邻接矩阵while(M--){cin>>i>>j;cin>>temp;a[i][j]=temp;a[j][i]=temp;//无向图}for(int k=1;k<=N;k++)djs(k,N);//每个点都做djst算法求最短路径if(ans_p==0) cout<<0;else cout<<ans_p<<" "<<ans_val<<endl;system("pause");return 0;}
就是一个地杰斯特最短路径算法,注意邻接矩阵的下标是从1-N,不是0-N-1 所以数组要开大一点。 其余没什么。
------------------------------------------------------------------------------------------------总结:
c语言幂项表示方法:pow(x,y)=x^y
涉及到数字精度的问题:
1.保留n位有效数字:printf("%.nf",temp);
2.尽量用double不用float
两者的区别:
类型 比特数 有效数字 数值范围 float 32 6-7 -3.4*10(-38)~3.4*10(38) double 64 15-16 -1.7*10(-308)~1.7*10(308) long double 128 18-19 -1.2*10(-4932)~1.2*10(4932)
简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字
还有,有个例子:在C和C++中,如下赋值语句
float a=0.1;
编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '
原因:
在C/C++中(也不知道是不是就在VC++中这样),上述语句等号右边0.1,我们以为它是个float,但是编译器却把它认为是个double(因为小数默认是double),所以要报这个warning,一般改成0.1f就没事了。
通常的做法,经常使用double,而不喜欢使用float。
3.大数的运算都是用数组来模拟的
- PAT记录
- PAT记录
- PAT段错误记录
- 2-10. 海盗分赃【PAT记录】
- PAT L3-001. 凑零钱(背包&路径记录)
- PAT 5-24 Find More Coins 背包记录路径
- PAT乙级 记录每道题应该注意的地方
- 我的PAT乙级练习题1001代码记录
- 我的PAT乙级练习题1002代码记录
- 我的PAT乙级练习题1003代码记录
- 我的PAT乙级练习题1003代码记录
- pat L2-001. 紧急救援 dijkstra变形+记录路径
- PAT L3-001. 凑零钱((背包&路径记录)
- PAT题型分类 & 跟着《算法笔记》撸PAT的记录汇总
- pat
- 【PAT】
- PAT
- PAT
- android 中文件加密 解密 算法实战
- 直接插入排序
- java中获取map的键值对方法
- linux开发之Valgrind代码使用内存检测的使用说明
- 一组PKCS#11 RSA签名测试数据
- PAT记录
- 3.6. Building RPMs from Source
- 50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段
- linux下播放器设计和开发
- IPD流程在华为15年发展历程…
- C#的6种常用集合类大比拼
- COCOS2D-X之CPP调用Android函数Demo
- ZOJ 3763 —— Plasma Field(几何,数学)
- 设计模式学习(四)——装饰者模式