送外卖

题目描述

冬天到了,小伙伴们都懒得出去吃饭了,纷纷打电话叫起了外卖。送外卖的小哥想找出一条最短的路径,小区门口进来,送完外卖又回到小区门口。

整个小区是一个由m*n个边长为1的正方形组成的矩形,各幢公寓楼分布于正方型的顶点上,小区门口位于左上角。每幢楼与相邻的八个方向的楼之间都有道路。

下图为m=2,n=3的小区地图,并且外卖小哥要经过的最短路径为6。

输入描述:

输入有多组数据。

每组数据包含两个整数m (2≤n≤2^128) 和n (2≤r≤2^128),分别代表行数和列数。


输出描述:

对应每一组数据,输出外卖小哥需要经过的最短路径。结果保留两位小数。

输入例子:

2 2
3 3

输出例子:

4.00

9.41

代码:

#include <iostream>  
#include <string>  
#include <vector>  
#include <stdlib.h>  
using namespace std;  

struct bigcheng{  
    vector<int> a;  
    vector<int> b;  
    string result_str;  
};  

//字符串转换为数字并反转
void chartonum(string a,string b,bigcheng &tempcheng){  
    int size_a = a.size();  
    int size_b = b.size();  
    for (int i = size_a-1;i >= 0;i--){  
        tempcheng.a.push_back(a[i] - '0');  
    }  
    for (int i = size_b-1;i >= 0;i--){  
        tempcheng.b.push_back(b[i] - '0');  
    }  
}  

//逐位相乘,处理进位消除多余的0  
void multiply(bigcheng &tempcheng,vector<int> &result_num){  
    for(int i = 0;i < tempcheng.a.size();i++){  
        for(int j = 0;j < tempcheng.b.size();j++){  
            result_num[i+j] += (tempcheng.a[i]) * (tempcheng.b[j]);//结果存放在result_num[i+j]中
        }  
    }  
    for (int i = result_num.size() - 1;i >= 0;i--){  
        if (result_num[i] != 0){  
            break;  
        }else  
            result_num.pop_back();  
    }  
    int c = 0;  
    for(int i = 0;i < result_num.size();i++){ //处理进位 
        result_num[i] += c;  
        c = result_num[i] / 10;  
        result_num[i] = result_num[i] % 10;  
    }  
    if(c != 0){  
        result_num.push_back(c);  
    }  
}  

//将计算结果转换为字符串并反转 
void numtochar(bigcheng &tempcheng,vector<int> &result_num){   
	int size = result_num.size();  
    for(int i = 0;i < result_num.size();i++){  
        tempcheng.result_str.push_back(static_cast<char>(result_num[size-1-i]+'0'));  
    }  
}  

int main(){
	string a,b;
    while(cin >> a >> b){
    	bigcheng tempcheng;   
    	chartonum(a,b,tempcheng);  
    	vector<int> resultnum(a.size()+b.size());  
    	multiply(tempcheng,resultnum);  
    	numtochar(tempcheng,resultnum);  
        if((tempcheng.result_str[tempcheng.result_str.size()-1]-'0') % 2 == 0){
            cout << tempcheng.result_str << ".00" << endl;
        }else{
        	cout << tempcheng.result_str << ".41" << endl;
		}
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值