Partida Rol por web

[TALLER] Online Math Open: Umbria team

Problema 12

Cargando editor
29/10/2019, 21:50
Atreide

Let F(n) denote the smallest positive integer greater than n whose sum of digits is equal to the sum of the digits of n. For example, F(2019) = 2028. Compute F(1) + F(2) + ... + F(1000):

Cargando editor
29/10/2019, 22:09
Atreide

Haciéndolo a mano, es fácil y entretenido ver a cada número cuál es el siguiente que le corresponde. Se puede ver, también, que siguen un patrón. Sin embargo, para sumar los 1000 como pide, he preferido hacer un programa que lo haga por mí. Adjunto programa y solución. Si veis algún error, avisadme.

#include <iostream>

using namespace std;

int suma(int n){
    int s=0;
    while (n>0){
        s+=n%10;
        n=n/10;
    }
    return s;
}

int siguiente(int n, int s){
    int i;
    for(i=n+1; suma(i)!=s;i++){}
    return i;
}

int main(){
    int ac=0;
    for(int i=1;i<=1000;i++){
        cout<<i<<" "<<siguiente(i,suma(i))<<endl;
        ac+=siguiente(i,suma(i));}
    cout<<endl<<endl<<ac;

}

Solución: 535501

Cargando editor
29/10/2019, 22:22
udas

Prueba a escribir el programa poniendo, en el último paso, i<=1, a ver si te da 2,porque creo que te dará 1 y eso no es correcto (F(1)=2)

Cargando editor
29/10/2019, 22:33
Atreide

No, da 10.

Si ponemos i<=1 sólo hace la iteración para el 1. Busca el número siguiente al 1, que es el 10, al ser el primero cuyas cifras suman lo mismo. No añade más números, pues sólo se hace para ese.

Cargando editor
30/10/2019, 08:12
udas

F(1)=1 luego la suma debe ser 1...cierto fallo. Está correcto entonces.

Cargando editor
30/10/2019, 08:53
Atreide

No entiendo lo que dices, F(1)=10.

Cargando editor
30/10/2019, 08:55
udas

Que tengo hambre y me como los 0s,jaja. Lo dicho, que es verdad, que el siguiente a 1 es 10.