紫书 习题3-2 分子量(字符串,常量数组)

#include<stdio.h>
#include<string.h>
int main()
{
    int t,i,num;

    char a[]={‘C‘,‘H‘,‘O‘,‘N‘};
    double n[]={12.01,1.008,16.00,14.01};//此所谓之常量数组的妙用
    char s[105];

    double sum;

    scanf("%d",&t);
    while(t--)
    {
        sum=0;//每次多组数据输入时sum复位
        scanf("%s",s);
        for(i=0;i<strlen(s);i++)
        {
            if(s[i+1]>=‘0‘&&s[i+1]<=‘9‘)//字符后面带数字
            {
                if(s[i+2]>=‘0‘&&s[i+2]<=‘9‘)//带了两位数字
                {
                    num=10*(s[i+1]-‘0‘)+(s[i+2]-‘0‘);
                }
                else//带了一位数字
                    num=s[i+1]-‘0‘;
            }

            else//不带数字
                num=1;

                     if(s[i]==a[0]) sum += num*n[0];
                else if(s[i]==a[1]) sum += num*n[1];
                else if(s[i]==a[2]) sum += num*n[2];
                else if(s[i]==a[3]) sum += num*n[3];
        }

        printf("%.3f\n",sum);
    }
    return 0;
}

  

#include <stdio.h>
#include <string.h>
int main()
{
    double d[200];
    int n,sum,i;
    double w;
    char c,a[1000];
    d[‘C‘]=12.01;
    d[‘H‘]=1.008;
    d[‘O‘]=16.00;
    d[‘N‘]=14.01;  //常量数组的妙用
    scanf("%d",&n);
    while(n--)
    {
        i=0;
        w=0;
        scanf("%s",a);
        while(a[i]!=‘\0‘)
        {
            sum=0;
            c=a[i];
            i++;
            while(a[i]>=‘0‘ && a[i]<=‘9‘) //判断字符后面有多少数字的
            {
                sum=sum*10+a[i]-‘0‘;    //sum为数字大小/包括数字占后面1,2,3···位的
                i++;                   //往后遍历是否有数字
            }
            if(sum)                  //若字符后面有数字,分子量=分子数*单位原子质量
                w+=sum*(d[c]);
            else                    //若字符后面无数字
                w+=(d[c]);
        }
        printf("%.3f\n",w);
    }
    return 0;
}
/*
解题思路:

1.将分子量用double 数组记录下来

2.将字符串存储在字符数组中,从头向后扫描,一直记住“字母”,对下一个字符进行判断,是否是数字,如果是数字:用一个整数记录,本代码中用的sum,同时下标++。

  进行判断,查看是否对数字进行了记录,即查看sum是否进入了while循环并被赋值,如果没有被赋值,说明下一个字符不是数字,直接对W(总记录)值进行赋值,为当前字符的权值(分子量),即double数组的中的值。如果被赋值,说明字符后面是一个数字,sum中存放了该“数字”,也是对w赋值,不过此时是赋sum倍的当前字符的权值(分子量)。

3.最后整个字符串循环完毕,输出总记录W即可。*/

  

时间: 2024-10-22 17:18:44

紫书 习题3-2 分子量(字符串,常量数组)的相关文章

紫书 习题3-1 得分(字符串)

1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s[100]; 6 scanf("%s",s); 7 int sum=0; 8 int cnt=0; 9 for(int i=0;i<strlen(s);i++) 10 { 11 if(s[i]=='O') 12 { 13 cnt++; 14 sum+=cnt; 15 } 16 else 17 { 18 cnt=0; 19 }

紫书 习题3-5

#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const char inst[] = "ABLR"; const int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int main(void) { int t = 0; char s[5][6]; char c; while ((s[0

紫书 习题2-5 分数化小数

1 #include<stdio.h> //基础版 2 #define MAX 110 3 4 int main(void) 5 { 6 int a, b, c; 7 scanf("%d %d %d",&a,&b,&c); 8 9 int integer = a/b; 10 int remainderTemp=a%b; 11 int arr[MAX]; 12 13 for(int i = 0; i< c; i++){ 14 int result

紫书 习题3-4 周期串

#include<stdio.h> #include<string.h> int main(void) { int n,stlen,i,j; char carr[1000]; while(scanf("%d",&n)!=EOF) { while(n--) { scanf("%s",carr); stlen=strlen(carr); for(i=1; i<=stlen; i++) { if(stlen%i==0) { for(j

紫书 习题3-3 数数字

#include <stdio.h> #include <string.h> int main(void) { int n ; //freopen("input.txt" , "r" , stdin); //freopen("output.txt" , "w" , stdout); scanf("%d" , &n); while(n--) { int N ; int i ;

紫书 习题2-3 倒三角形

#include<iostream> #include<cstdio> #include<cstring> using namespace std; main() { int n,i,j; scanf("%d",&n); for(i=n-1;i>=0;i--){ for(j=0;j<n-i-1;j++){ printf(" ");//先把二维全置为空格 } for(j=0;j<2*i+1;j++){//把

紫书第三章 数组和字符串

1  序 系统的整理下第三章的学习笔记.例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上的标程好:习题除了3-8百度了求解方法,其它均独立完成后,会适当查阅网上资料进行整理总结.希望本博文方便自己日后复习的同时,也能给他人带来点有益的帮助(建议配合紫书--<算法竞赛入门经典(第2版)>阅读本博客).有不足或错误之处,欢迎读者指出. 2  例题 2.1  UVa272--Tex Quotes #include <stdio.h> int main() { bool log

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很

第11章例题(紫书)

10/15 这几天先专心刷一下图论的基础题目,也蛮多的,慢慢来... 例题11-1 uva 12219 题意:给你一个表达式,然后又一些子树在之前重复出现过,先要你给这些子树出现的顺序编个号1...N,然后如果重复出现就用编号替代,输出替代之后的表达式. 题解:这是一个表达式树的问题,显示建树,如果让我来写的话,很麻烦,搞不好复杂度是O(n^2),因为字符串是一直扫描下去的,所以就利用一个指针作为全局,然后一直扫下去,就忽略一个左括号,建左树,然后忽略逗号,建右树,忽略右括号,然后一直扫下去,就