写这个的原因是看到一位大神的习题答案总结,于是自己心血来潮也想写一个这个,目的主要是督促自己刷题吧,毕竟自己太弱了。
习题3-1 得分 UVa 1585
大致就是设置一个变量记录到当前为止的连续的O的数量,碰到X就变0,水题。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char s[90];
int main(void)
{
int length,n,sum,num;
scanf("%d",&n);
while(n--)
{
sum=num=0;
scanf("%s",s);
length=strlen(s);
for(int i=0;i<length;i++)
{
if(s[i]=='X')
{
num=0;
continue;
}
num++;
sum+=num;
}
printf("%d\n",sum);
}
return 0;
}
习题3-2 分子量 UV1586
很简单的一个字符串处理。我这里用到了ctype.h里的isupper()函数,还要注意单独一个元素符号后面没有数字的情况。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define tan 12.01
#define qing 1.008
#define yang 16.00
#define dan 14.01
char s[90];
int main(void)
{
int i,length,n,temp;
double sum;
scanf("%d",&n);
while(n--)
{
sum=0;
scanf("%s",s);
length=strlen(s);
if(isupper(s[length-1]))
{
s[length]='1';
s[length+1]='\0';
}
length=strlen(s);
for(i=0;i<length-1;i++)
{
if(isupper(s[i]) &&isupper(s[i+1]))
{
switch(s[i])
{
case 'C':sum+=tan;
break;
case 'H':sum+=qing;
break;
case 'O':sum+=yang;
break;
case 'N':sum+=dan;
break;
}
}
if(isupper(s[i]) &&!(isupper(s[i+1])))
{
int j=i+1;
while(!(isupper(s[j]))&&(j<length))
j++;
int myk,weishu=1;
temp=0;
for(myk=j-1;myk>=i+1;myk--)
{
temp+=weishu*(s[myk]-'0');
weishu*=10;
}
switch(s[i])
{
case 'C':sum+=tan*temp;
break;
case 'H':sum+=qing*temp;
break;
case 'O':sum+=yang*temp;
break;
case 'N':sum+=dan*temp;
break;
}
}
}
printf("%.3lf\n",sum);
}
return 0;
}
习题3-3 数数字 UVa1225
水题,数据不大,搞个数组就ok。注意数字字符到int类型的转换。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char a[40000];
char temp[10];
int main(void)
{
int t,i,n;
int num[10];
scanf("%d",&t);
while(t--)
{
a[0]='\0';
scanf("%d",&n);
for( i=1;i<=n;i++)
{
sprintf(temp,"%d",i);
strcat(a,temp);
}
int length;
length=strlen(a);
for(i=0;i<10;i++)
num[i]=0;
for(i=0;i<length;i++)
num[(a[i]-'0')]++;
for(i=0;i<9;i++)
printf("%d ",num[i]);
printf("%d",num[9]);
printf("\n");
}
return 0;
}
习题3-4 周期串 UVa455
数据量不大,直接暴力枚举周期,用总长度是周期的倍数剔除一部分,然后遍历全串,用%映射到周期中进行比较。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char a[90];
int main(void)
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
int length;
length=strlen(a);
int i,j,status;
for(i=0;i<length;i++)
{
status=1;
if(length%(i+1)!=0)
continue;
for(j=0;j<length;j++)
{
if(a[j]!=a[j%(i+1)])
status=0;
}
if(status==1)
{
if(n==0)
printf("%d\n",i+