When you think about soldiers sitting in trenches firing at each other with a constant fire rate, you could model it by giving each soldier an x% chance to hit and eliminate one enemy soldier per shot, and repeat until one army is defeated.

Note: The function random() in this example returns pseudoradom floating-point values equally distributed between 0.0 and 1.0.

    double kill_chance = 0.05; // 5% chance to kill an enemy per round
    int troops_A = 57; // starting strenght of army A
    int troops_B = 89; // starting strength of army B

    // combat loop
    while (troops_A > 0 && troops_B > 0) {
        int losses_A = 0;
        int losses_B = 0;
        // army A fires
        for (int i = 0; i < troops_A; i++) {
             if (random() < kill_chance) losses_B++;
        }
        // army B fires
        for (int i = 0; i < troops_B; i++) {
             if (random() < kill_chance) losses_A++;
        }
        // remove casualties
        troops_A -= losses_A;
        troops_B -= losses_B;
        // here would be a good place to report the combat progress to the player
    }
    // make sure no army ends up with a negative amount of soldiers
    if (troops_A < 0) troops_A = 0;
    if (troops_B < 0) troops_B = 0;

Note that this algorithm allows for a result where both armies lose. This would be equivalent to the last two soldiers shooting each other and then bleeding to death. Yeah, war is hell.