高精度模版

#include <iostream>
#include <string>

using namespace std;

int compare(string str1, string str2)
{
     if(str1.size() > str2.size())
        return 1;
    else if(str1.size() < str2.size())
        return -1;
    else
        return str1.compare(str2);
}
//高精度加法
string ADD_INT(string str1, string str2)
{
    string MINUS_INT(string str1, string str2);
    int sign = 1; 
    string str;
    if(str1[0] == '-') {
        if(str2[0] == '-') {
            sign = -1;
            str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1));
         }else {
             str = MINUS_INT(str2, str1.erase(0, 1));
         }
    }else {
        if(str2[0] == '-')
            str = MINUS_INT(str1, str2.erase(0, 1));
        else {
            string::size_type l1, l2;
            int i;
            l1 = str1.size(); l2 = str2.size();
            if(l1 < l2) {
                for(i = 1; i <= (int)(l2 - l1); i++)
                    str1 = "0" + str1;
            }else {
                for(i = 1; i <= (int)(l1 - l2); i++)
                    str2 = "0" + str2;
            }
            int int1 = 0, int2 = 0; 
            for(i = str1.size() - 1; i >= 0; i--) {
                int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) %10; 
                int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10;
                str = char(int1 + 48) + str;
            }
            if(int2 != 0) str = char(int2 + 48) + str;
        }
    }

    //运算后处理符号位
    if((sign == -1) && (str[0] !='0'))
        str = "-" + str;
    return str;
}



//高精度减法
string MINUS_INT(string str1, string str2)
{
    string MULTIPLY_INT(string str1, string str2);
    int i,sign = 1;
    string str;
    if(str2[0] == '-')
        str = ADD_INT(str1, str2.erase(0, 1));
    else {
        int res = compare(str1, str2);
        if(res == 0) return "0";
        if(res < 0) {
            sign = -1;
            string temp = str1;
            str1 = str2;
            str2 = temp;
		}
        string::size_type tempint;
        tempint = str1.size() - str2.size();
        for(int i = str2.size() - 1; i >= 0; i--) {
            if(str1[i + tempint] < str2[i]) {
                str1[i + tempint - 1] = char(int(str1[i + tempint - 1]) - 1);
                str = char(str1[i + tempint] - str2[i] + 58) + str;
			}
            else
                str = char(str1[i + tempint] - str2[i] + 48) + str;
		}
        for(i = tempint - 1; i >= 0; i--)
            str = str1[i] + str;
	}

    //去除结果中多余的前导0
    str.erase(0, str.find_first_not_of('0'));
    if(str.empty()) str = "0";
    if((sign == -1) && (str[0] !='0'))
        str = "-" + str;
    return str;
}






//高精度乘法
string MULTIPLY_INT(string str1, string str2)
{
    int sign = 1; 
    string str;
    if(str1[0] == '-') {
        sign *= -1;
        str1 = str1.erase(0, 1);
	}
    if(str2[0] == '-') {
        sign *= -1;
        str2 = str2.erase(0, 1);
	}
    int i, j;
    string::size_type l1, l2;
    l1 = str1.size(); l2 = str2.size();
    for(i = l2 - 1; i >= 0; i --) {
    //实现手工乘法
        string tempstr;
        int int1 = 0, int2 = 0, int3 = int(str2[i]) - 48;
        if(int3 != 0) {
            for(j = 1; j <= (int)(l2 - 1 - i); j++)
                 tempstr = "0" + tempstr;
            for(j = l1 - 1; j >= 0; j--) {
                int1 = (int3 * (int(str1[j]) - 48) + int2) % 10;
                int2 = (int3 * (int(str1[j]) - 48) + int2) / 10;
                tempstr = char(int1 + 48) + tempstr;
			}
            if(int2 != 0) tempstr = char(int2 + 48) + tempstr;
		}
        str = ADD_INT(str, tempstr);
	}
    //去除结果中的前导0
    str.erase(0, str.find_first_not_of('0'));
    if(str.empty()) str = "0";
    if((sign == -1) && (str[0] !='0'))
        str = "-" + str;
    return str;
}





//高精度除法
string DIVIDE_INT(string str1, string str2, int flag)
{
    //flag = 1时,返回商; flag = 0时,返回余数
    string quotient, residue; 
    int sign1 = 1, sign2 = 1, i;
    if(str2 == "0") {                                 //判断除数是否为0
        quotient = "ERROR!";
        residue = "ERROR!";
        if(flag == 1) return quotient;
        else return residue;
	}
    if(str1 == "0") {                                 //判断被除数是否为0
        quotient = "0";
        residue = "0";
	}
    if(str1[0] == '-') {
        str1 = str1.erase(0, 1);
        sign1 *= -1;
        sign2 = -1;
	}
    if(str2[0] == '-') {
        str2 = str2.erase(0, 1);
        sign1 *= -1;
	}
    int res = compare(str1, str2);
    if(res < 0) {
        quotient = "0";
        residue = str1;
	}else if(res == 0) {
        quotient = "1";
        residue = "0";
	}else {
        string::size_type l1, l2;
        l1 = str1.size(); l2 = str2.size();
        string tempstr;
        tempstr.append(str1, 0, l2 - 1);

        //模拟手工除法
        for(i = l2 - 1; i < l1; i++) {
            tempstr = tempstr + str1[i];
            for(char ch = '9'; ch >= '0'; ch --) { 
                string str;
                str = str + ch;
                if(compare(MULTIPLY_INT(str2, str), tempstr) <= 0)
				{
                    quotient = quotient + ch;
                    tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str));
                    break;
				}
			}
		}
        residue = tempstr;
	}

    //去除结果中的前导0
    quotient.erase(0, quotient.find_first_not_of('0'));
    if(quotient.empty()) quotient = "0";
    if((sign1 == -1) && (quotient[0] !='0'))
        quotient = "-" + quotient;
    if((sign2 == -1) && (residue[0] !='0'))
        residue = "-" + residue;
    if(flag == 1) return quotient;
    else return residue;
}
//高精度除法,返回商
string DIV_INT(string str1, string str2)
{
    return DIVIDE_INT(str1, str2, 1);
}

//高精度除法,返回余数
string MOD_INT(string str1, string str2)
{
    return DIVIDE_INT(str1, str2, 0);
} 


int main()
{
	//freopen("in.txt","r",stdin);
    char ch;
    string s1, s2, res;
    while(cin >> ch) {
        cin >> s1>> s2;
        switch(ch) {
        case '+': res = ADD_INT(s1, s2); break; //高精度加法
        case '-': res = MINUS_INT(s1, s2); break; //高精度减法
        case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法
        case '/': res = DIV_INT(s1, s2); break; //高精度除法,返回商
        case 'm': res = MOD_INT(s1, s2); break; //高精度除法,返回余数
        default : break;
}
    cout << res<< endl;
}
    return(0);
}



1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值