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. 数列求和

时间限制  
400 ms
内存限制  
32000 kB
代码长度限制  
8000 B
判题程序    
Standard    

给定某个正整数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

样例输入与输出:

序号输入输出1
1024
1024=2^10
2
1323
1323=3^3*7^2
3
97532468
97532468=2^2*11*17*101*1291
4
1
1=1
5
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. 素因子分解

 时间限制  
400 ms
内存限制  
32000 kB
代码长度限制  
8000 B
判题程序    
Standard    

给定某个正整数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

样例输入与输出:

序号输入输出1
1024
1024=2^10
2
1323
1323=3^3*7^2
3
97532468
97532468=2^2*11*17*101*1291
4
1
1=1
5
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.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+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帐户的申请与登陆

时间限制  
800 ms
内存限制  
32000 kB
代码长度限制  
8000 B
判题程序    
Standard    

实现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”。

样例输入与输出:

序号输入输出1
5L 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. 修理牧场

时间限制
400 ms
内存限制  
32000 kB
代码长度限制  
8000 B
判题程序    
Standard    

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要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块的最少花费。

样例输入与输出:

序号输入输出1
84 5 1 2 1 3 1 1
49
2
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. 哈利·波特的考试

 时间限制  
400 ms
内存限制  
32000 kB
代码长度限制  
8000 B
判题程序    
Standard    

哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。

现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物。老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事。于是他来问你:带什么动物去可以让最难变的那种动物(即该动物变为哈利·波特自己带去的动物所需要的魔咒最长)需要的魔咒最短?例如:如果只有猫、鼠、鱼,则显然哈利·波特应该带鼠去,因为鼠变成另外两种动物都只需要念4个字符;而如果带猫去,则至少需要念6个字符才能把猫变成鱼;同理,带鱼去也不是最好的选择。

输入格式说明:

输入说明:输入第1行给出两个正整数N(<=100)和M,其中N是考试涉及的动物总数,M是用于直接变形的魔咒条数。为简单起见,我们将动物按1~N编号。随后M行,每行给出了3个正整数,分别是两种动物的编号、以及它们之间变形需要的魔咒的长度(<=100),数字之间用空格分隔。

输出格式说明:

输出哈利·波特应该带去考场的动物的编号、以及最长的变形魔咒的长度,中间以空格分隔。如果只带1只动物是不可能完成所有变形要求的,则输出0。如果有若干只动物都可以备选,则输出编号最小的那只。

样例输入与输出:

序号输入输出1
6 113 4 701 2 15 4 502 6 505 6 601 3 704 6 603 6 805 1 1002 4 605 2 80
4 70
2
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.大数的运算都是用数组来模拟的

 

 

 

0 0
原创粉丝点击