乘积的末三位

题目名称:乘积的末3位(product)
 * 题目描述:
 * 输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。
 * 这些整数中会混入一些由大写字母组成的字符串,你的程序中应当忽略它们。
 * 样例输入:+1 +2 + -1 -2 k 12 english 54 9876 -111

 * 样例输出:712


/**
 * 题目分析:
 *     题目难度主要在于参差的数据类型输入。
 * 题目总思路,使用while语句逐个string作为单词输入。
 * 然后通过调用函数bool getInt(...)判断该单词是否整数,另外,再利用该函数的形参将正确的整数返回。
 * 将从函数里面得出的整数与结果相乘,乘后保留末三位整数即可。
 * 其中,关于如何实现bool getInt(string get, int & nowGet)才是难题。实现方法如下:
 * 首先,考虑不是整数的情况,1.字符串为空,返回false, 2.是字母或是仅有一个符号。
 * 除了字符串为空的情况外,我们可以开始考虑字符串不为空的情况,字符串不为空时,存在三种情况,
 * 第一种,带符号的整数,第二种,不带符号的整数,第三种,不是整数。
 * 关于这三种情况,可以使用一个if-else if- else语句来实现,
 * 第一种情况:if ('+' == get[0] || '-' == get[0])带上了符号,可以直接忽略读取第[0]位符号位,然后再
 *               从最尾位开始读取,读取3位数即可停止,当读取途中不满三位数或者碰上符号位时,
 *               立即返回。
 * 第二种情况:if('0' <= get[0] && '9' >= get[0]) 直接是数字的情况下,跟第一种情况的思路基本一致,
 *               直接从最尾位开始取个位数,次尾位取十位数,倒数第三位取百位数。
 * 第三种情况:由于不符合需要的整数的转换条件,只需要直接返回false即可.
 * 另外,如果想将字符型的数字转换成数值,只需要将原来的字符型减去'0'即可得到相对应的数值。
 **/

#include <cstring>
#include <string>
#include <cctype>
#include <cmath>
#include <iostream>

using namespace std;


bool getInt(string get, int & nowGet)
{
	int stringLong = get.length();
	if (0 == stringLong){
		return false;
	}
	nowGet = 0;
	if ('+' == get[0] || '-' == get[0]){ // 带符号的正数或负数
		if (0 == (stringLong - 1)){ // 它只包含了一个符号,则直接返回
			return false;
		}
		for (int j = 0, i = stringLong - 1; i > 0 && i >= stringLong - 3; --i, ++j){
			if ('+' == get[i] || '-' == get[i]){	// 正在循环转换的过程,这个数字不满三位数,遇上了符号,直接跳出
				break;
			}
			nowGet += int(get[i] - '0') * (int) (pow(double(10), j));
		}
		return true;
	}
	else if('0' <= get[0] && '9' >= get[0]){ // 直接是数字的情况下
		for (int j = 0, i = stringLong - 1; i >= 0 && i >= stringLong - 3; --i, ++j){
			nowGet += int(get[i] - '0') * (int) (pow(double(10), j));
		}
		return true;
	}
	else{	// 是字母
		return false;
	}
}

int main()
{
    string word;
    long result = 1;
    while(cin >> word){
		int temp;
		if (getInt(word, temp))
		{
			result = (result * temp) % 1000;
		}
    }
	cout << result << endl;
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值