Праект Эйлера - 1: Знаходжанне кратныя 3 і 5

Праект Эйлера - Праблема 1: Знайсці суму ўсіх лікаў, кратных 3 ці 5 ніжэй 1000.

Праглядаючы пытанні тут пра той жа праблеме я мяркую, як я спрабаваў вырашыць гэта вельмі дрэнна. Што такое лепшы спосаб вырашыць гэтую праблему?

А другі мой пытанне: Значэнне сумы не адпавядае адказу. Я думаю, што праблема ў тым, што, калі я выкарыстоўваю Еогеасп выпісваць значэнне ў спісе яго пачынаецца з 705 замест 3, але я паняцця не маю, чаму. Я быў бы ўдзячны, калі хто-то можа растлумачыць мне.

Гэта код, які я выкарыстоўваю ў цяперашні час:

List numbers = new List();
for (int i = 3; i < 1000; i += 3)
{
    numbers.Add(i);
}
for (int j = 5; j < 1000; j += 5)
{
    numbers.Add(j);
}
numbers.ForEach(Console.WriteLine);
int sum1 = numbers.Sum();
Console.WriteLine(sum1);
Console.ReadLine();
2
Зрабіць канец значна менш (г.зн. 16 замест 1000) і паглядзіце на вынік.
дададзена аўтар Alexei Levenkov, крыніца
«Тое, што гэта лепшы спосаб вырашыць гэтую праблему?» - Пастаяннае час вырашэння .
дададзена аўтар mbeckish, крыніца
«Тое, што гэта лепшы спосаб вырашыць гэтую праблему?» - Пастаяннае час вырашэння .
дададзена аўтар mbeckish, крыніца
«Тое, што гэта лепшы спосаб вырашыць гэтую праблему?» - Пастаяннае час вырашэння .
дададзена аўтар mbeckish, крыніца
Гэта з праекта Эйлера? У мяне ёсць вялікая рашэнне гэтай праблемы на маім сайце: fixbyproximity.com пад розным Эйлера. Я не магу наўпрост звязаць яго, таму што я на працы, і яны блакуюць мой сайт. Праверце гэта, хоць, ён праходзіць праз некалькі розных шляхоў вырашэння гэтага.
дададзена аўтар Mike, крыніца
Гэта з праекта Эйлера? У мяне ёсць вялікая рашэнне гэтай праблемы на маім сайце: fixbyproximity.com пад розным Эйлера. Я не магу наўпрост звязаць яго, таму што я на працы, і яны блакуюць мой сайт. Праверце гэта, хоць, ён праходзіць праз некалькі розных шляхоў вырашэння гэтага.
дададзена аўтар Mike, крыніца
Ды яго з PE, дзякуй за спасылку
дададзена аўтар Peter, крыніца
Дзякуй за каментары і для ўсіх розных рашэнняў :)
дададзена аўтар Peter, крыніца
Дзякуй за каментары і для ўсіх розных рашэнняў :)
дададзена аўтар Peter, крыніца
Ды яго з PE, дзякуй за спасылку
дададзена аўтар Peter, крыніца
Ды яго з PE, дзякуй за спасылку
дададзена аўтар Peter, крыніца

13 адказы

Гэта адбываецца таму, што колькасці дазваляе дублікаты. Звярніце ўвагу, што вы будзеце мець некаторыя дублікаты, ёсць - напрыклад, колькасці 15, 30, 45, і гэтак далей, будуць дададзеныя ў два разы.

замяшчаць

List numbers = new List();

з

ISet numbers = new HashSet();

і гэта будзе працаваць, таму што HashSet не дазволіць паўтараюцца значэння.

4
дададзена
Яна не працуе, то значэнне сумы 60 такім чынам.
дададзена аўтар Peter, крыніца
мой дрэнны, я змяніўся ад 1000 да 16 гадоў і не заўважыў :) дзякуй за адказ
дададзена аўтар Peter, крыніца

Гэта адбываецца таму, што колькасці дазваляе дублікаты. Звярніце ўвагу, што вы будзеце мець некаторыя дублікаты, ёсць - напрыклад, колькасці 15, 30, 45, і гэтак далей, будуць дададзеныя ў два разы.

замяшчаць

List numbers = new List();

з

ISet numbers = new HashSet();

і гэта будзе працаваць, таму што HashSet не дазволіць паўтараюцца значэння.

4
дададзена
Яна не працуе, то значэнне сумы 60 такім чынам.
дададзена аўтар Peter, крыніца
мой дрэнны, я змяніўся ад 1000 да 16 гадоў і не заўважыў :) дзякуй за адказ
дададзена аўтар Peter, крыніца

Гэта адбываецца таму, што колькасці дазваляе дублікаты. Звярніце ўвагу, што вы будзеце мець некаторыя дублікаты, ёсць - напрыклад, колькасці 15, 30, 45, і гэтак далей, будуць дададзеныя ў два разы.

замяшчаць

List numbers = new List();

з

ISet numbers = new HashSet();

і гэта будзе працаваць, таму што HashSet не дазволіць паўтараюцца значэння.

4
дададзена
Яна не працуе, то значэнне сумы 60 такім чынам.
дададзена аўтар Peter, крыніца
мой дрэнны, я змяніўся ад 1000 да 16 гадоў і не заўважыў :) дзякуй за адказ
дададзена аўтар Peter, крыніца

Прычына ваш выснову пачынаецца з 705 таму, што ваш спіс нумароў даволі доўгі (532 нумары, каб быць дакладным). Ваша акно кансолі можа ўтрымліваць толькі некалькі радкоў, перш чым ён пачне перамяшчацца.

Такім чынам, вы пачынаеце з нумарам 3, гэта проста не відаць.

3
дададзена

Прычына ваш выснову пачынаецца з 705 таму, што ваш спіс нумароў даволі доўгі (532 нумары, каб быць дакладным). Ваша акно кансолі можа ўтрымліваць толькі некалькі радкоў, перш чым ён пачне перамяшчацца.

Такім чынам, вы пачынаеце з нумарам 3, гэта проста не відаць.

3
дададзена

Вы без уліку лікаў, якія абодва кратныя 3 <�моцны> і 5

Калі б я цябе, я б нешта накшталт наступнага

for(int i=1; i<1000; i++)
{
    if(i is a multiple of 15)
        //account for 15
    else if(i is a multiple of 3)
        //account for 3
    else if(i is a multiple of 5)
        //account for 5
}
3
дададзена
<�Код> ((я кратна 3) || (я кратна 5)) будзе, верагодна, лепш.
дададзена аўтар Alexei Levenkov, крыніца
@AlexeiLevenkov вы, верагодна, маюць рацыю. Я думаў пра праблему FizzBuzz, калі я зрабіў гэта
дададзена аўтар Sam I am, крыніца

Вы без уліку лікаў, якія абодва кратныя 3 <�моцны> і 5

Калі б я цябе, я б нешта накшталт наступнага

for(int i=1; i<1000; i++)
{
    if(i is a multiple of 15)
        //account for 15
    else if(i is a multiple of 3)
        //account for 3
    else if(i is a multiple of 5)
        //account for 5
}
3
дададзена
<�Код> ((я кратна 3) || (я кратна 5)) будзе, верагодна, лепш.
дададзена аўтар Alexei Levenkov, крыніца
@AlexeiLevenkov вы, верагодна, маюць рацыю. Я думаў пра праблему FizzBuzz, калі я зрабіў гэта
дададзена аўтар Sam I am, крыніца

Вы без уліку лікаў, якія абодва кратныя 3 <�моцны> і 5

Калі б я цябе, я б нешта накшталт наступнага

for(int i=1; i<1000; i++)
{
    if(i is a multiple of 15)
        //account for 15
    else if(i is a multiple of 3)
        //account for 3
    else if(i is a multiple of 5)
        //account for 5
}
3
дададзена
<�Код> ((я кратна 3) || (я кратна 5)) будзе, верагодна, лепш.
дададзена аўтар Alexei Levenkov, крыніца
@AlexeiLevenkov вы, верагодна, маюць рацыю. Я думаў пра праблему FizzBuzz, калі я зрабіў гэта
дададзена аўтар Sam I am, крыніца

Гэта першая праблема на Project Euler .

Асабіста я выкарыстаў адзін лайнер:

Enumerable.Range(0, 1000).Where(n => n % 3 == 0 || n % 5 == 0).Sum()

Але вы таксама можаце выкарыстоўваць доўгі шлях для больш чытальнасці:

int sum = 0;
for (int i = 0; i < 1000; i++)
{
    if ((i % 3 == 0) || (i % 5 == 0))
    {
        sum = sum + i;
    }
}

If you don't know how the modulo (%) operator works, I suggest you read it here

Калі вам трэба больш інфармацыі пра самую праблеме, проста стварыць уліковы запіс на Project Euler, увядзіце адказ, і прачытаць праблемы Агляд .

3
дададзена

Як ужо адзначалася, праблема ў тым, што ваш код падлічвае кратныя 15 двойчы. Вядома, гэтая задача даволі лёгка з дапамогай дыяпазон і Дзе </а> метады:

var numbers = Enumerable.Range(0, 1000)
                        .Where(n => n % 3 == 0 || n % 5 == 0);
foreach(var n in numbers)
{
    Console.WriteLine(n);
}

var sum = numbers.Sum();
Console.WriteLine(sum);
Console.ReadLine();

2
дададзена

У вас ёсць паўтараюцца значэння ў спісе. Вось чаму агульная сума несапраўдная. Вы лепш змяніць структуру дадзеных HashSet, які не дапускае дублікатаў.

Калі вы не можаце зрабіць гэта, ці вы павінны працягваць такім чынам, паспрабуйце ніжэй

call numbers = numbers.Distinct().ToList(); before numbers.ForEach(Console.WriteLine);

<�Р> Я думаю, што праблема ў тым, што, калі я выкарыстоўваю Еогеасп выпісаць спіс   шануем яго пачынаецца з 705 замест 3, але я паняцця не маю, чаму.

Праблема заключаецца ў паўтаральных значэння, Еогеасп будзе друкаваць правільна, але вы не можаце мець магчымасць пракручваць кансоль для пачатку друку.

try Console.WriteLine(string.Join(",", numbers));

1
дададзена
Нягледзячы на ​​тое, што б працаваць, вы, верагодна, хочаце, каб пазбегнуць з'яўлення дублікатаў, каб пачаць з, або пазбавіцца ад іх раней, чым гэта. Простае рашэнне заключаецца ў выкарыстанні больш прыдатнай структуры дадзеных, чым спіс.
дададзена аўтар Servy, крыніца
@Servy Ды Правільна. Абноўлены мой адказ
дададзена аўтар Damith, крыніца

У вас ёсць паўтараюцца значэння ў спісе. Вось чаму агульная сума несапраўдная. Вы лепш змяніць структуру дадзеных HashSet, які не дапускае дублікатаў.

If you can't do that or you have to proceed with this way, try below

call numbers = numbers.Distinct().ToList(); before numbers.ForEach(Console.WriteLine);

I think the problem is that when I use foreach to write out the list value its starts from 705 instead of 3, but I have no idea why.

Problem is duplicate values, foreach will print correctly but you may not able to scroll console to beginning of printing.

try Console.WriteLine(string.Join(",", numbers));

1
дададзена
Нягледзячы на ​​тое, што б працаваць, вы, верагодна, хочаце, каб пазбегнуць з'яўлення дублікатаў, каб пачаць з, або пазбавіцца ад іх раней, чым гэта. Простае рашэнне заключаецца ў выкарыстанні больш прыдатнай структуры дадзеных, чым спіс.
дададзена аўтар Servy, крыніца
@Servy Ды Правільна. Абноўлены мой адказ
дададзена аўтар Damith, крыніца

Акрамя таго, можна вырашыць з Linq. Выкарыстоўвайце Enumerable.Range , каб атрымаць усе лікі ад 0 да 999 (уключна). Затым выкарыстоўвайце Дзе , каб адфільтраваць тыя з якіх дзеліцца на 3 <�ем> або дзеліцца на 5. Нарэшце выкарыстоўваць Sum .

0
дададзена