Другие языки программирования и технологии

Помогите с задачей С++ (Нужно очень срочно)

Задача D. Следующее число

Для заданного натурального числа N найти минимальное число M,
большее N, с той же, что у N, суммой цифр.

Исходные данные
В единственной строке записано число N (1 < N < 10^100000).
Результат
Вывести единственное число M.

Пример
Исходные данные / Результат
524 533
1 10
999 1899
#include <stdio.h>
void inc(char* s)
{ int r,j;
for(r=-1;s[++r];);
for(j=r-1;j>=0;j--) if(s[j]=='9') s[j]='0'; else { s[j]++; break; }
}

int main()
{ int i,j,k,r,n0,n9;
char x,s[100001];
printf("(1...10^100000): ");
scanf("%s",s);
for(r=-1;s[++r];);
for(n0=0,j=r-1;j>=0 && s[j]=='0';j--) n0++;
for(x=s[j--],n9=0;j>=0 && s[j]=='9';j--) n9++;
s[j+1]=0;
if(j
Elvin Rzayev
Elvin Rzayev
76 473
Лучший ответ
Можно так: СМОТРИ ССЫЛКУ или здесь

#include "iostream.h"
#include "conio.h"

int main(int argc, char* argv[])
{
char *n = new char[100001];

cout << "Vvod N:";
cin >> n;
cout << endl;
cout << "N=" << n << endl;

int lenN = strlen(n);
// если введена не пустая строка
if(lenN > 0)
{
char *nend = n+lenN-1; // указатель на последний символ или младший разряд числа
char s=0; // статус

char *p = nend; // указатель текущего обрабатываемого символа
char *sd = nend; // указатель сдвигаемого символа

// если последний символ не 0
if (*p != '0')
{
(*p)--; // то просто уменьшим его на 1
s=1; // статус в 1
p--; // сместим указатель на 1 вниз
}
else // иначе 0 и поиск не нулевого символа
{
while(s==0 && p>=n) // делать пока статус 0 или пока не вышли за границу
{
// если символ не 0
if (*p != '0')
{
(*p)--; // то просто уменьшим на 1
// переместим этот символ в конец строки, а за место этого 0 впишем
*nend = *p; *p = '0';
s=1; // статус в 1
}
p--; // сместим указатель на 1 вниз
}
}

while(s==1 && p>=n) // делать пока статус 1 или пока не вышли за границу
{
// если символ 9, то затолкнуть его в конец
if(*p == '9')
{
// перепишем позицию взяв из разряда правее
*p = *(p+1);
*(sd-1) = *sd; //сдвинем
*sd = '9'; // на место сдвигаемого можно записать 9
*nend = '9'; // последний символ всегда 9
sd--; // новая позиция сдвигаемого символа
}
else // иначе нашли не 9
{
(*p)++; // то просто увеличим его на 1
s=2; // статус в 2
}

p--; // сместим указатель на 1 вниз
}

// если статус остался 1, то все 9 и надо добавить 1 в начало
if(s==1) cout << "M=1" << n << endl;
// иначе если статус 2, то просто вывод
else if(s==2) cout << "M=" << n << endl;

// если введены все 0, то вывода не будет

}

delete[] n;
getch();
return 0;
}
я бы запилил цикл от числа до макс числа, потом переводил бы новые числа в строки и вычислял бы сумму и сверял бы с суммой начального числа
p.s. цикл от начального числа +1
p.s.s. ничу ты не проверял, я те скинул на почту решение, но на другом языке, тебе надо только найти эквиваленты функций другого языка для С++.