#include<stdio.h>
#include<string.h>
char a[5]={'C','H','O','N'};
double b[4]={12.01,1.008,16.00,14.01};
int sum[4]={0};
int r(char s){
if('0'<=s&&s<='9')return 1;
else return 0;
}
int main(){
char s[100];
int T;scanf("%d",&T);
while(T--){
memset(s,'\0',sizeof(s));
memset(sum,0,sizeof(sum));
scanf("%s",s);
int n=strlen(s);int k=0,ans=1;int cnt=0;
for(int i=0;i<n;i++){
if(r(s[i])){
while(r(s[i])){
k=k*10+s[i]-'0';
i++;
}
sum[cnt]+=(k-1);
k=0;
i--;
}
else if(!r(s[i])){//TURE
for(int j=0;j<=3;j++){
if(a[j]==s[i]){
sum[j]++;
cnt=j;
break;
}
}
}
}
double num=0.000;
for(int i=0;i<4;i++){
num=num+(sum[i]*b[i]);
}
printf("%.3lf\n",num);
num=0;
}
return 0;
} //于输出处检查
uva 1586
1 在输出处检查很容易发现问题所在,比如打印sum数组
2我本来是一个一个处理的,发现条件复杂,要考虑最后一个是数字的情况,比如遇到数字直接处理,少了不少标记变量。怎么说,,,从简单开始划分,抓住主要矛盾。
#include <stdio.h>
#include <string.h>
char s[50000];
char s1[10];
int t[20];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,j=0;
memset(t,0,sizeof(t));
memset(s,0,sizeof(s));
memset(s1,0,sizeof(s1));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if(i<10) s[j++]=i+'0';
else
{
int tem1,tem2=i,k=0;
while(tem2 > 0)
{
tem1= tem2%10;
tem2 /= 10;
s1[k++]=tem1+'0';
}
for(int m=k-1;m>=0;m--) s[j++]=s1[m];
}
}
// printf("%s\n",s);//正序存字符
for(int i=0;i<strlen(s);i++)
{
for(int j=0;j<=9;j++)
{
if(s[i]-'0'==j) t[j]++;//全0数组对应位置加1
}
}
for(int i=0;i<=9;i++)
{
if(i!=9) printf("%d ",t[i]);
else printf("%d\n",t[i]);
}
}
return 0;
}
#include<stdio.h>
#include<string.h>//maybe打表
void bond(int *num,int n){
for(int i=1;i<=n;i++){
int ans=0;int j=i;
while(j!=0){
ans=j%10;
num[ans]++;
j/=10;
}
}
}
int main(){
int num[10]={0};
int k;scanf("%d",&k);
while(k--){
int n;scanf("%d",&n);
bond (num,n);
int d=1;
for(int i=0;i<=9;i++){
if(!d){
printf(" ");
d=0;
}
printf("%d",num[i]);
d=0;
}
putchar('\n');
memset(num,0,sizeof(num));
}
return 0;
}
uva 1225
第二个是我的思路,比较暴力,没什么好说的.
第一个是别人的算法,把1到n写入字符数组,然后读取。
对于求每一位上的数码,用字符数组有奇效。
#include<stdio.h>
#include<string.h>
int main(){
int n;scanf("%d",&n);// int y=n;
for(int j=1;j<=n;j++){
char s[90];
memset(s,'\0',sizeof(s));
//!g?getchar():g=0;
scanf("%s",s);
if(s[0]=='\n')continue;
int len=strlen(s);
int k;int f;
for(k=1;k<=len;k++){
for(int i=0;i<len;i++){
f=1;
if(s[i]!=s[(i+k)%k]){
f=0;
break;
}
if(len%k!=0){
f=0;break;
}
}
if(f)goto suc;
}
suc:{
if(j!=1)printf("\n");
printf("%d\n",k);
}
}
return 0;
}
uva 455
在输入输出上比较搞
过滤伪周期。如abcdabcda,此时4不是周期,不满足len%i == 0,所以此序列周期为9。