1009 Product of Polynomials (25 分)
这道题是1002的升级版,求多项式A*B,其实都异曲同工,将多项式A保存在数组a中,然后B中每输入一项,就跟多项式A相乘,结果累加到数组b中,逆序输出即可。
1108 Finding Average (20 分)
输入一些字符串,逐个判断是否符合条件,并将符合条件的字符串([-1000,1000]的最多含2位小数的数字)累加求平均值。
这道题的坑在: 当只有一个值的时候,numbers要改为number,而输出照样是保留2位小数
代码如下:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main(){
int n,cnt=0;
float total=0;
string now;
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
int len=s.length();
//flag=1为符合,flag=0为不符合;sign记录负号;遇到小数点后digit++
int flag=1,sign=0,digit=-1;
float sum=0;
for(int j=0;j<len;j++){
if(!(s[j]=='-'||s[j]=='.'||(s[j]>='0'&&s[j]<='9'))){
flag=0;
break;
}
if(j==0&&s[j]=='-')sign=1;
else if(s[j]=='.')digit++;
else if(digit>=0&&digit<2){
if(digit==0)sum+=(s[j]-'0')*0.1;
else if(digit==1)sum+=(s[j]-'0')*0.01;
digit++;
}
else if(digit>=2){
flag=0;
break;
}
else{
sum=sum*10+(s[j]-'0');
}
}
if(flag){
if(sum>1000||sum<-1000){//sum
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
continue;
}
now=s;
if(sign==1)total-=sum;
else total+=sum;
cnt++;
}
else{
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
}
}
if(cnt==1){//注意此处的number没有s
printf("The average of %d number is %.2f",cnt,total/cnt);
}
else if(cnt>=1){
printf("The average of %d numbers is %.2f",cnt,total/cnt);
}
else{
cout<<"The average of 0 numbers is Undefined";
}
return 0;
}
1148 Werewolf - Simple Version (20 分)
万恶的狼人杀!
其实这道题不难,真的不难,去年考乙级做的时候,一心只想着用i和j去假设说假话的人,但其实这样是没办法做的,因为有些人没办法确定是狼人还是好人(没被提及),而且有些人可能被重复提及。换一种思路,若反过来,我们用i和j去假设是狼人,那么剩下的就是好人了,把所有人说的话都遍历一遍,如果结果刚好符合条件,就直接输出并return,否则就是没找到符合的结果,输出没有解。
代码如下:(简单得一匹)
#include <iostream>
#include <string>
using namespace std;
int main(){
int n,tell[105],a[105]={0},lie[105]={0};
cin>>n;
for(int i=1;i<=n;i++){
cin>>tell[i];
}
//假设i和j是狼人
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
//初始状态谁都没说谎,都是0
for(int k=1;k<=n;k++)lie[k]=0;
for(int k=1;k<=n;k++){
//第k个人说,那个编号的人是狼人,但那个人的编号不等于i也不等于j
if(tell[k]<0&&(abs(tell[k])!=i&&abs(tell[k])!=j))lie[k]=1;
//第k个人说,那个编号的人是好人,但那个人的编号等于i或者等于j
if(tell[k]>0&&(tell[k]==i||tell[k]==j))lie[k]=1;
}
//cnt统计说谎人数,wolf统计说谎狼人数
int cnt=0,wolf=0;
for(int k=1;k<=n;k++){
//如果第k个人说谎了,那cnt++
if(lie[k]==1)cnt++;
//如果第k个人说谎了并且是狼人,那wolf++
if(lie[k]==1&&(k==i||k==j))wolf++;
}
//如果说谎人数统计为2个,说谎的狼人统计为1个,那么就可以直接输出结果了。
if(cnt==2&&wolf==1){
cout<<i<<" "<<j;
return 0;
}
}
}
//没在假设里得到结果,那么就是没结果
cout<<"No Solution";
return 0;
}
网友评论