算法的乐趣c/c++ —— 1.1.7入门习题

声明:摘选自“ 算法竞赛入门经典(第2版)”作者:  刘汝佳  /  陈锋   ISBN:9787302291077

习题1得分给出
           一个由O和X组成的串(长度为1~80),统计得分。每个O的得分为目前连续出现的O的个数,X的得分为0.例如,OOXXOXXOOO的得分为1 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 2 + 3。
解题思路:

我们设置一个中间变量沉默用来存储ö的个数即ö出现连续次数的分数,当出现X时,NUM置零,通过判断NUM的值来计算得分。

#include<stdio.h>
#include<string.h>
int main()
{
	char s[90];                  //定义一个字符串
	int sum=0, num=0;           //sum用于记录得分,num记录O连续出现的次数
	scanf("%s", s);             //输入字符串
	int len = strlen(s);        //记录输入字符串的长度
	for(int i=0; i<len; i++)    //循环读取单个字符 
	{
		if(s[i] == 'O')         //如果字符为 O ,num自加,sum等于num累加和 
		{
			num++;
			sum += num;
		}
		else                    //如果不为O,num归零 
		{
			num = 0;
		}
		if(i==len-1) printf("%d", num); else printf("%d+", num);	//如果不是最后一位数,打印 1+ 格式,否则只打印数字 1格式	
	}
	printf(" = %d", sum);       //打印总得分
	return 0; 

} 

分子量

        给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C,H,O,N,原子量分别为12.01,1.008,16.00,14.01(单位:g / mol)。例如,C6H5OH的分子量为94.108g / mol。
 解题思路:

   首先我们利用元素减去 'A' 的ASCII码当索引值来存储原子质量。然后通过判断字符串元素的ASCII码来判断是原子还是数字(数字的ASCII最大为57,大写字母的ASCII码均大于57)。因为字符串第一个元素必定是原子,所以我们就将判断下一个元素是数字还是原子,如果是原子,那么总质量暂时等于原子质量。如果为数字,那么我们就需要继续判断数字的下一个元素为数字还是原子,如果为原子,那么总质量就暂时等于原子质量乘以数字。如果为数字,那么我们就需要判断再下一位元素为数字还是原子了。重复此过程,直到获得分子量。如果元素个数只是个位数的话,这个程序会简单很多。

最后一位元素如果为原子,那么是不会加到分子质量里面的,所以在最后我们需要手动加上最后一个元素的原子质量。如果最后一位为数字,那么就没有此问题。

下面是代码,里面也进行了详细的介绍:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	double num=0;                    //定义分子量总和 
	float name[15];               /*定义数组来存放四种原子质量
	                              name2为C原子质量,name7为H原子质量,name13为N原子质量,name14为O原子质量
	                              name的索引值是由 ‘原子符号’-‘A’获得的ASCII码 */
	name[2]=12.01, name[7]=1.008, name[13]=14.01, name[14]=16.00; 
	char s[20];                   //定义输入字符串
	scanf("%s", s);               //输入字符串 
	int len = strlen(s);          //计算输入字符串的长度
	for(int i=0; i<len; i++)      //循环读取每个字符串 
	{
		double qul=0;                //用于记录某一个原子的质量 
		if(int(s[i]) > 57)        //如果s[i]的ASCII码大于57,说明这是一个原子 
		{
			qul = name[int(s[i]-'A')];             //获取原子的原子质量 
			if(i+1 <= len && int(s[i+1]) > 57)  //如果下一个元素是原子,那么只加一次质量
			{
				num += qul;
			} 
			else                  //如果下一个元素不是原子,那么就要计算是数字多少了 
			{
				int j = 0;        //j用于记录有几位数字 
				int val = 0;      //用来记录是数字几 
				while(j+i+1 < len && int(s[j+i+1]) < 57) //只要是数字就循环计数 
				{
					j ++;       
				}
				for(int m=0; j>0; j--,m++)
				{
					val += float(s[m+i+1]-'0') * pow(10,j-1);    //pow(10,n)为10的n次方 ,value为原子的个数 
				
				}
				num += qul*val;                                //得到val个原子的原子质量 
			}
		} 
	} 
	printf("%f g/mol\n", num+name[int(s[len-1]-'A')]);                   //因为最后一个元素 无法判断,所以在最后面加上最后一个原子质量 
	return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值