鱼C论坛

 找回密码
 立即注册
查看: 1838|回复: 10

[已解决]c++ 编程问题

[复制链接]
发表于 2019-2-9 01:02:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
楼主想要编写一个令在一个一维方程里,从第bi位数至ei位数自动向左相加的程序,方程命名为bool add_left(std::vector<int> v,int bi,int ei);
譬如:
v={1,1,2,2,3,3,4,4}
bi=4,ei=6
v(after)={1,1,2,2,6,0,4,4}
请问大佬有没有什么好的办法。。。谢谢
最佳答案
2019-2-10 13:56:58
#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std; 

vector<int> Add_left(vector<int> v, int bi, int ei)
{
        int temp=0;
        for (int i = bi; i < ei; i++)
        {
                temp += v[i];
                v[i] = 0;
        }
        v[bi] = temp;
        return v;
}

vector<int> Add_Samenum(vector<int> v)
{
        vector<int> v2;
        int temp;
        for (int i = 0; i < v.size(); i++)
        {
                if (v[i] == v[i + 1])
                {
                        temp = v[i] + v[i + 1];
                        i++;
                }
                else
                        temp = v[i];
                v2.push_back(temp);
        }
        while (v2.size() < v.size())
        {
                v2.push_back(0);
        }
        return v2;
}

int main()
{
        vector<int> v1 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        vector<int> v2 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        v1 = Add_left(v1, 4, 6);
        v2 = Add_Samenum(v2);
        for (int i = 0; i < v1.size(); i++)
        {
                cout << v1[i] << " ";
        }
        cout << endl;
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-9 11:49:45 | 显示全部楼层
#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std; 

vector<int> Add_left(vector<int> v, int bi, int ei)
{
        int temp=0;
        for (int i = bi; i < ei; i++)
        {
                temp += v[i];
                v[i] = 0;
        }
        v[bi] = temp;
        return v;
}

int main()
{
        vector<int> v = { 1,1,2,2,3,3,4,4 };
        v = Add_left(v, 4, 6);
        for (int i = 0; i < v.size(); i++)
        {
                cout << v[i] << " ";
        }
        system("pause");
        return 0;
}
中间自动向左相加的过程我的理解是把第bi位到第ei位加起来赋值个第bi位。如果不对请解释一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 06:43:45 | 显示全部楼层
Mountain_gs 发表于 2019-2-9 11:49
中间自动向左相加的过程我的理解是把第bi位到第ei位加起来赋值个第bi位。如果不对请解释一下。

嗯嗯,还有一个小问题,就是只有相同的数字相加,
就像这样:
v={1,1,2,2,3,3,4,4,5,5,6,6}
bi=0,ei=v.size()
v={2,4,6,8,10,12,0,0,0,0,0,0}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 07:43:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-10 13:56:58 | 显示全部楼层    本楼为最佳答案   
#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std; 

vector<int> Add_left(vector<int> v, int bi, int ei)
{
        int temp=0;
        for (int i = bi; i < ei; i++)
        {
                temp += v[i];
                v[i] = 0;
        }
        v[bi] = temp;
        return v;
}

vector<int> Add_Samenum(vector<int> v)
{
        vector<int> v2;
        int temp;
        for (int i = 0; i < v.size(); i++)
        {
                if (v[i] == v[i + 1])
                {
                        temp = v[i] + v[i + 1];
                        i++;
                }
                else
                        temp = v[i];
                v2.push_back(temp);
        }
        while (v2.size() < v.size())
        {
                v2.push_back(0);
        }
        return v2;
}

int main()
{
        vector<int> v1 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        vector<int> v2 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        v1 = Add_left(v1, 4, 6);
        v2 = Add_Samenum(v2);
        for (int i = 0; i < v1.size(); i++)
        {
                cout << v1[i] << " ";
        }
        cout << endl;
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 17:33:40 | 显示全部楼层
感谢大佬!太感谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 17:34:37 | 显示全部楼层
我后来又稍微改了改大佬的代码#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std;

vector<int> Add_left(vector<int> v, int bi, int ei)
{
        int temp=0;
        for (int i = bi; i < ei; i++)
        {
                temp += v[i];
                v[i] = 0;
        }
        v[bi] = temp;
        return v;
}

vector<int> Add_Samenum(vector<int>& v,int bi,int ei)
{
        vector<int> v2,v3,v4;
        int temp;

        for(int i=bi;i<ei;i++){
          if(v[i]!=0)
          v4.push_back(v[i]);
        }
        for (int i = bi; i < ei; i++)
        {
            if(v[i]!=0){
                if (v[i] == v[i + 1])
                {
                        temp = v[i] + v[i + 1];
                        i++;
                }
                else
                        temp = v[i];
                v2.push_back(temp);
              }
              else{
                v3.push_back(0);
              }

        }
        while (v2.size() < v4.size())
        {
                v2.push_back(0);
        }
        v.erase(v.begin()+bi,v.begin()+ei);
        for(int i=0;i<v2.size();i++){
          v.insert(v.begin()+bi+i,v2[i]);
        }
        for(int i=0;i<v3.size();i++){
          v.insert(v.begin()+bi+v2.size(),v3[i]);
        }

        return v;
}

int main()
{
        vector<int> v1 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        vector<int> v2 = { 1,1,2,2,3,3,4,4,5,5,6,6 };
        v1 = Add_left(v1, 4, 6);
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        std::cout<<std::endl;
        v2 = Add_Samenum(v2,0,4);
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        v2 = Add_Samenum(v2,4,8);
        std::cout<<std::endl;
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        std::cout<<std::endl;
        v2 = Add_Samenum(v2,8,12);
        std::cout<<std::endl;
        for (int i = 0; i < v1.size(); i++)
        {
                cout << v1[i] << " ";
        }
        cout << endl;
        std::cout<<std::endl;
        for (int i = 0; i < v2.size(); i++)
        {
                cout << v2[i] << " ";
        }
        system("pause");
        return 0;
}
这样就能实现目标了,太感谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 17:41:00 | 显示全部楼层

大佬,能再问一个问题吗,如何在0到n之间产生一个随机数呢。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-10 18:33:58 | 显示全部楼层
调用rand()就行了,再写个函数在a,b之间取随机数
int random(int a, int b)
{
        int r;
        return rand() % (b - a) + a;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-10 20:11:58 | 显示全部楼层
ok!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-2-11 00:07:15 | 显示全部楼层
还有大佬,为什么第29行else后面不加{}还能运行呀。。。,太奇妙了,这是什么原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 08:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表