for循环中迭代次数错误。也获得意外输出

时间:2013-12-30 17:08:04

标签: c++ loops

Codeforces问题160A - http://codeforces.com/problemset/problem/160/A

我得到1或2作为所有测试用例的输出。我认为这是因为解决方案结束时的for循环只运行一次或两次。我无法确定为什么是循环在最多2次迭代后结束。我的解决方案出了什么问题。

我的解决方案:

#include<iostream>
using namespace std;


int total(int x,int y,int array[100]) //Function to calculate sum of xth to yth term of array.
{
    int z=0;

    for(int a=x;a<=y;a++)
    {
        z+=array[a];
    }

    return z;
}

int main()
{
    int n,coin[],sum1,sum2,i,j,a,temp,noofcoins;

    cin>>n;

    for(i=0;i<n;i++)
    cin>>coin[i];

    for(i=0;i<n;i++) //Bubble sorting array in descending order.
    {
        for(j=0;j<n-i-1;j++)
        {
            if(coin[j]<coin[j+1])
            {
                temp=coin[j];
                coin[j]=coin[j+1];
                coin[j+1]=temp;
            }
        }
    }

    noofcoins=0;
    sum1=0;
    sum2=0;

    for(i=0;((i<n)&&(sum1<=sum2));i++)
    {
        sum1+=coin[i];
        sum2=total(i+1,n,coin);
        ++noofcoins;
    }

    cout<<noofcoins;
}

5 个答案:

答案 0 :(得分:1)

您已将i定义为全局变量。 您在i函数中使用totalmain中使用itotal用于调用total的循环。因此,在您致电i后,main已成为不同的值,{{1}}中的循环将结束。

答案 1 :(得分:1)

首先,避免使用全局变量。该声明属于主体

int n,coin[100],sum1,sum2,i,j,temp,noofcoins;

更正后,您会注意到函数i中使用的变量totalmain中使用的变量for(int i=x;i<y;i++) 相同。只需在for中初始化它。

for(i=0;((i<n)&&(sum1<=sum2));i++)

然后,最终的条件是错误的。它应该是:

{{1}}

答案 2 :(得分:1)

你已经宣布我是一个全局变量然后你在两个地方使用它然后肯定会导致问题

答案 3 :(得分:0)

1 - 没有理由全局声明您的变量,最好在main()函数中声明它们。

2 - 你的冒泡方式似乎是错误的。正确的方法是对气泡进行分类,直到不需要交换为止。

bool flag=flase;
while (!flag){
    flag=true;
    for(i=0;i<n-1;i++){ //Bubble sorting array in descending order.
        if (coin[i]<coin[i+1]){
            temp=coin[i];
            coin[i]=coin[i+1];
            coin[i+1]=temp;
            flag=false;
        }
    }
}

3 - 将数组传递给函数的方式不正确。阅读部件&#34;阵列作为参数&#34; on this page以正确的方式。

4 - 最后,您可能想要使用&#34; new&#34;用于创建数组的函数。这样,它不会限制在100的最大阵列大小,并且当阵列小于100时也不会浪费内存。

Read here学习使用&#34; new&#34;功能

答案 4 :(得分:0)

以下可能有所帮助:

int twin(std::vector<int> coins)
{
    std::sort(coins.begin(), coins.end());
    const int total = std::accumulate(coins.begin(), coins.end(), 0);
    int left = total;
    int right = 0;
    for (size_t i = 0; i != coins.size(); ++i)
    {
        const int value = coins[coins.size() - 1 - i];
        left -= value;
        right += value;
        if (right > left) {
            return 1 + i;
        }
    }
    return 0;
}