第三章 上机练习
习题3-1 分数统计stat
习题3-1 得分(UVa1585 Score)
#include
#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T–){
char s[100]={0};
scanf("%s",s);
int n=strlen(s),count=0,sum=0;
for(int i=0;i<n;i++){
if(s[i]==‘X’)count=0;
else{count++;sum+=count;}
}
printf("%d\n",sum);
}
return 0;
}
习题3-2 分子量(UVa1586 Molar Mass)
#include
#include<stdio.h>
#include<string.h>
using namespace std;
double mass(char ch){
switch(ch){
case 'C':return 12.01;
case 'H':return 1.008;
case 'O':return 16.00;
case 'N':return 14.01;
}
}
int main(){
const int maxn=1000;
int T;
scanf("%d",&T);
while(T--){
char s[maxn]={0};
scanf("%s",&s);
int n=strlen(s),tmp2=1,first=1;
double sum=0,tmp1=0;
for(int i=0;i<n;i++){
if(s[i]=='C' || s[i]=='H' || s[i]=='O' || s[i]=='N'){
first=1;
sum+=tmp1*tmp2;
tmp1=mass(s[i]);
tmp2=1;
}
else{
if(first){tmp2=s[i]-'0';first=0;}
else tmp2=tmp2*10+s[i]-'0';
}
}
sum+=tmp1*tmp2;
printf("%.3lf\n",sum);
}
return 0;
}
习题3-3 数数字(UVa1225 Digit Counting)
#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T–){
long long a[10]={0};
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int tmp=i;
while(tmp>0){ a[tmp%10]++; tmp/=10; }
}
for(int i=0;i<=9;i++)
printf("%d%c",a[i],i==9?’\n’:’ ');
}
return 0;
}
习题3-4 周期串(UVa455 Periodic Strings)
#include
#include<string.h>
#include<stdio.h>
using namespace std;
int main(){
const int maxn=85;
int T,second=0;
scanf("%d",&T);
while(T--){
char s[100]={0};
scanf("%s",s);
int n=strlen(s);
for(int i=1;i<=n;i++){
if(n%i) continue;
int a=n/i,flag=0;
char tmp1[maxn+5]={0};
memcpy(tmp1,s,i);
for(int j=1;j<a;j++){//第j个周期
char tmp2[maxn+5]={0};
memcpy(tmp2,&s[i*j],i);
if(strcmp(tmp1,tmp2)){flag=1;break;}
}
if(flag)
continue;
else{
printf("%d\n",i);
if(T)printf("\n");
break;
}
}
}
return 0;
}
习题 3-5 谜题(UVa227 Puzzle)
注意:这道题的输入输出都比较坑:
输入是带空白符的字符串,需要用scanf("%c")读入,并结合getchar()读走行末回车;也可以直接用gets()一排一排的读入。
输出也挺坑:要求行末无空格、文末无空行,但文末要有换行符,而且相邻两组数据间用空行隔开……非常烦人。
#include<string.h>
#include<stdio.h>
using namespace std;
int main(){
const int maxn=5;
int count=1,firsttmp=1;
while(true){
char map[maxn+1][maxn+1]={0};
int x=0,y=0;
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++){
scanf("%c",&map[i][j]);
if(map[0][0]‘Z’)return 0;
}
getchar();
}
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++){
if(map[i][j]’ ‘)
{x=i;y=j;}
}
char s[1000]={0};
int flag=0,n=0;
for(n=0;;n++){
scanf("%c",&s[n]);
if(s[n]==‘0’)break;
}
getchar();
if(firsttmp)firsttmp=0;
else printf("\n");
printf(“Puzzle #%d:\n”,count++);
for(int i=0;i<n;i++){
if(flag)continue;
switch(s[i]){
case’A’: if(x-1>=0) { map[x][y]=map[x-1][y]; map[x-1][y]=’ ‘; x–; }
else { printf(“This puzzle has no final configuration.\n”); flag=1; }
break;
case’B’: if(x+1<maxn){ map[x][y]=map[x+1][y]; map[x+1][y]=’ ‘; x++; }
else { printf(“This puzzle has no final configuration.\n”); flag=1; }
break;
case’L’: if(y-1>=0) { map[x][y]=map[x][y-1]; map[x][y-1]=’ ‘; y–; }
else { printf(“This puzzle has no final configuration.\n”); flag=1; }
break;
case’R’: if(y+1<maxn){ map[x][y]=map[x][y+1]; map[x][y+1]=’ ‘; y++; }
else { printf(“This puzzle has no final configuration.\n”); flag=1; }
break;
}
}
if(!flag){
int first=1;
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
printf("%c%c",map[i][j],j+1<maxn?’ ‘:’\n’);
}
}
return 0;
}