分别使用while、do-while和for语句编程,找出所有的水仙花数并输出。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分别使用while、do-while和for语句编程,找出所有的水仙花数并输出。相关的知识,希望对你有一定的参考价值。

For语句

public class numl

public static void main(String[] args)

int x, y, z, i, sum;

for(i=100;i<1000;i++)

z=i%100%10;

y=i/10;

y=y%10; 

x=i/ 100;

sum=x*x*x+y*y*y+z*Z*z;

if (sum=i)

System. out. println (sum+"是水仙花数”) ;

Whi le语句

public class numl

public static void main(String[] args)

int x, y, z, i=100, sum;

while(i<1000)

z=i%100%10;

y=i/10;

y=y%10;

x=i/ 100;

sum=x*x*x+y*y*y+z*z*z;

if(sum==i)

System. out. println(sum+”是水仙花数"); .

i++;

Do-whil e语句

public class numl

public static void main(String[] args)

int x, y, z, i=100, sum;

do

z=i%100%10;

y=i/10;

y=y%10;

x=i/ 100;

sum= Fx*x*x+y*y*y+z*z*z;

if (sum=i)

System. out. println(sum+”是水仙花数”);

while(i<1000) ;

扩展资料

do-while循环的与for循环,while循环的区别

一、循环结构的表达式不同

do-while循环结构表达式为:do循环体;。

for循环的结构表达式为:for(单次表达式;条件表达式;末尾循环体)中间循环体。

while循环的结构表达式为:while(表达式)循环体。

二、执行时判断方式不同

do-while循环将先运行一次,因为经过第一次do循环后,当检查条件表达式的值时,其值为 不成立时而会退出循环。保证了至少执行do 内的语句一次。

for循环执行的中间循环体可以为一个语句,也可以为多个语句,当中间循环体只有一个语句时,其大括号可以省略,执行完中间循环体后接着执行末尾循环体。

while循环执行时当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。

参考技术A

C语言程序:

#include "stdio.h"

/* 使用while循环找出所有的水仙花数 */
void flower1()

int n;
int a, b, c;

n = 100;
while(n < 1000)

a = n / 100;
b = n / 10 % 10;
c = n % 10;
if(a*a*a + b*b*b + c*c*c == n)
printf("%d\\n", n);
n++;



/* 使用do-while循环找出所有的水仙花数 */
void flower2()

int n;
int a, b, c;

n = 100;
do

a = n / 100;
b = n / 10 % 10;
c = n % 10;
if(a*a*a + b*b*b + c*c*c == n)
printf("%d\\n", n);
n++;
 while(n < 1000);


/* 使用for循环找出所有的水仙花数 */
void flower3()

int n;
int a, b, c;

for(n=100; n<1000; n++)

a = n / 100;
b = n / 10 % 10;
c = n % 10;
if(a*a*a + b*b*b + c*c*c == n)
printf("%d\\n", n);



void main()

printf("使用while循环找出的水仙花数\\n");
flower1();

printf("使用do-while循环找出的水仙花数\\n");
flower2();

printf("使用for循环找出的水仙花数\\n");
flower3();


运行结果:

使用while循环找出的水仙花数
153
370
371
407
使用do-while循环找出的水仙花数
153
370
371
407
使用for循环找出的水仙花数
153
370
371
407

参考技术B 100——1000内的水仙花数
首先是for:
int i,j,k,n;
for( n=100;n<1000;n++)
i=n/100;
j=(n%10)/10;
k=n%10;
if(n==i*i*i+j*j*j+k*k*k)
System.out.println(n);


参考技术C dim i as integer,m as integer
for i=100 to 999
m=(i mod 10)^3 +(i \10 mod 10)^3+(i\100)^3
if m=i then print i
next i

Dim a%, b%, c%
For a = 1 To 9
For b = 0 To 9
For c = 0 To 9
If a ^ 3 + b ^ 3 + c ^ 3 = a * 100 + b * 10 + c Then
print a * 100 + b * 10 + c
End If
Next c
Next b
Next a
参考技术D 水仙花数是无穷的 你给个范围 比方说三位的水仙花数,或者不到五位的之类。

C 编程中的 for vs. while?

【中文标题】C 编程中的 for vs. while?【英文标题】:For vs. while in C programming? 【发布时间】:2011-02-26 09:55:56 【问题描述】:

C 中有三个循环:forwhiledo-while。它们有什么区别?

例如,似乎几乎所有while 语句都可以替换为for 语句,对吧?那么,使用while有什么好处呢?

【问题讨论】:

您忘记了条件GOTO 循环。虽然人们不认为它是一个循环,但我相信所有循环本质上都会编译为条件 GOTO 循环。 递归不是也算循环吗? 编写一个在 x86 isa 中将一个简单的 for 循环编译成更高效的 loop 指令(减法、比较和跳转在单个指令中)的编译器,难道不会比编译的更容易吗? while 进入 loop 指令?当前的编译器是否将for 编译成loop 指令? 【参考方案1】:

while 循环将始终首先评估条件。

while (condition) 
  //gets executed after condition is checked

do/while 循环 将始终执行 do 块中的代码首先 然后评估条件。

do 
  //gets executed at least once
 while (condition); 

for 循环允许您在一行中启动计数器变量、检查条件和递增计数器的方法。

for (int x = 0; x < 100; x++) 
   //executed until x >= 100

归根结底,它们仍然是循环,但它们在执行方式方面提供了一些灵活性。

这里很好地解释了使用每种不同类型的循环背后的推理,这可能有助于理清问题。谢谢clyfe

for的主要区别 while 的问题是 语用学:我们平时用for的时候 有已知的迭代次数, 并使用while 构造时 中的迭代次数未知 进步。 whiledo ... while 问题也是语用学问题, second 执行一次指令 在开始时,然后它的行为 就像简单的while一样。


For 循环特别好,因为它们很简洁。为了这个for循环:

for (int x = 0; x < 100; x++) 
   //executed until x >= 100

要编写为 while 循环,您必须执行以下操作:

int count = 0;
while (count < 100) 
  //do stuff
  count++;

在这种情况下,还有更多内容需要跟上,count++; 可能会迷失在逻辑中。这最终可能会很麻烦,具体取决于count 在哪里增加,以及它是否应该在循环逻辑之前或之后增加。使用for 循环,您的计数器变量总是在循环的下一次迭代之前递增,这为您的代码增加了一些一致性。


为了完整起见,在这里讨论breakcontinue 语句可能很有意义,它们在进行循环处理时会派上用场。

break 将立即终止当前循环,不再执行迭代。

//will only run "do stuff" twice
for (int x = 0; x < 100; x++) 
  if (x == 2) 
    break;
  
  //do stuff

continue 将终止当前迭代并继续进行下一个迭代。

//will run "do stuff" until x >= 100 except for when x = 2
for (int x = 0; x < 100; x++) 
  if (x == 2) 
    continue;
  
  //do stuff

请注意,在 for 循环中,continue 计算 for (part1; part2; part3)part3 表达式;相反,在while循环中,它只是跳转以重新评估循环条件。

【讨论】:

你应该讨论“继续”的行为吗?在“for”循环与“while”循环中?否则,很好的答案。 +1 以获得出色的答案。值得注意的是:for 循环不需要计数器变量。在 C 风格的语言中,它们实际上是 for (; ; )。恰好最常见的用法是计数器变量:for (int x = 0 [start]; x for'swhile's 之间的主要区别在于语用学问题:当有已知的迭代次数时,我们通常使用for,并且当事先不知道迭代次数时,使用while 构造。 whiledo ... while 的问题也是语用问题,第二个在开始时执行指令一次,然后它的行为就像简单的while +1 写得很好的答案,有时重温“基础”对每个人都有好处 我喜欢这个答案,特别是在你谈到在“for”的情况下增加计数器的一致性的部分,而在“while”的情况下可能在迭代中的任何地方。老实说,我永远不会说得这么雄辩,尽管这里没有太多新意【参考方案2】:

如果非常关注速度和性能,最好的方法是在汇编级别验证编译器生成的代码。

例如,以下代码显示“do-while”要快一些。这是因为“do-while”循环不使用“jmp”指令。

顺便说一句,在这个特定的例子中,最坏的情况是由“for”循环给出的。 :))

int main(int argc, char* argv[])

    int i;
    char x[100];

    // "FOR" LOOP:
    for (i=0; i<100; i++ )
    
        x[i] = 0;
    

    // "WHILE" LOOP:
    i = 0;
    while (i<100 )
    
        x[i++] = 0;
    

    // "DO-WHILE" LOOP:
    i = 0;
    do
    
        x[i++] = 0;
    
    while (i<100);

    return 0;

//“FOR”循环:

    010013C8  mov         dword ptr [ebp-0Ch],0
    010013CF  jmp         wmain+3Ah (10013DAh)

  for (i=0; i<100; i++ )
  
      x[i] = 0;
    010013D1  mov         eax,dword ptr [ebp-0Ch]  <<< UPDATE i
    010013D4  add         eax,1
    010013D7  mov         dword ptr [ebp-0Ch],eax
    010013DA  cmp         dword ptr [ebp-0Ch],64h  <<< TEST
    010013DE  jge         wmain+4Ah (10013EAh)     <<< COND JUMP
    010013E0  mov         eax,dword ptr [ebp-0Ch]  <<< DO THE JOB..
    010013E3  mov         byte ptr [ebp+eax-78h],0
    010013E8  jmp         wmain+31h (10013D1h)     <<< UNCOND JUMP
  

//“WHILE”循环:

  i = 0;
  010013EA  mov         dword ptr [ebp-0Ch],0
  while (i<100 )
  
      x[i++] = 0;
    010013F1  cmp         dword ptr [ebp-0Ch],64h   <<< TEST
    010013F5  jge         wmain+6Ah (100140Ah)      <<< COND JUMP
    010013F7  mov         eax,dword ptr [ebp-0Ch]   <<< DO THE JOB..
    010013FA  mov         byte ptr [ebp+eax-78h],0
    010013FF  mov         ecx,dword ptr [ebp-0Ch]   <<< UPDATE i
    01001402  add         ecx,1
    01001405  mov         dword ptr [ebp-0Ch],ecx
    01001408  jmp         wmain+51h (10013F1h)      <<< UNCOND JUMP
  

//“DO-WHILE”循环:

i = 0;
.  0100140A  mov         dword ptr [ebp-0Ch],0
  do
  
      x[i++] = 0;
    01001411  mov         eax,dword ptr [ebp-0Ch]   <<< DO THE JOB..
    01001414  mov         byte ptr [ebp+eax-78h],0
    01001419  mov         ecx,dword ptr [ebp-0Ch]   <<< UPDATE i
    0100141C  add         ecx,1
    0100141F  mov         dword ptr [ebp-0Ch],ecx
    01001422  cmp         dword ptr [ebp-0Ch],64h   <<< TEST
    01001426  jl          wmain+71h (1001411h)      <<< COND JUMP
  
  while (i<100);

【讨论】:

【参考方案3】:

为了便于阅读

【讨论】:

就此而言,您也可以使用 goto 作为循环。 另外,还有递归。你可以用任何其他样式替换任何样式的循环。 事实上……所有的循环实际上只是花哨的 GOTO 分支。 @WhirlWind 除了在没有递归的语言中,您可能最终会出现堆栈溢出。 (你最终可能会在这里询问堆栈溢出,这会让我微笑。) @Sean 是的,我在考虑这个问题,如果有办法绕过堆栈溢出。当然,如果有尾递归...【参考方案4】:

它们都是可以互换的;您可以选择一种类型并且永远使用它,但通常对于给定任务来说更方便。这就像说“为什么要使用 switch,你可以只使用一堆 if 语句”——没错,但如果检查变量的一组值是一种常见的模式,那么如果有语言特性,它会更方便且更容易阅读这样做

【讨论】:

并非如此。 for 和 while 都可以执行 body 零次 - do-while 不能。 @Neil do if(!cond) break; /* do stuff */ while(cond);。丑陋且重复,但这就是我关于为什么存在变化的观点:) @Neil:您可以使用附加标志来跳过第一次执行。 Interchangeable 并没有说明它有多容易或有用。 ;) 循环体仍被输入——while 和 for 的情况并非如此。 @Neil 好吧,对于“循环体”的某些定义。无论哪种方式,它都会导致相同的行为——如果cond 为假,它不会运行/* do stuff */ 部分【参考方案5】:

如果您希望在条件为真时执行循环,而不是进行一定次数的迭代,那么其他人更容易理解:

while (cond_true)

比这样的:

for (; cond_true ; )

【讨论】:

我不知道要容易得多。我大胆猜测,如果 C 没有第一种形式,我们现在都已经习惯了第二种形式。 很公平,但我保证如果我在我维护的任何代码中看到第二个版本,我会想“WTF”...... 代码应该读成散文,前者更接近自然语言。也许不是“容易得多”,但很可能会更快地识别和理解。【参考方案6】:

请记住,for 循环本质上是一个花哨的while 循环。 它们是一样的。

while <some condition is true> 
   // do some stuff
   // possibly do something to change the condition



for ( some var, <some condition is true>; increment var ) 


for 循环的优点是更难意外执行无限循环。或者更确切地说,当你这样做时会更明显,因为你通常将循环变量放在初始语句中。

当您不使用标准递增模式时,while 循环会更加清晰。例如:

int x = 1;
while( x != 10 ) 
  if ( some condition )
     x = 10;
  else 
     x += 5;

【讨论】:

不过,for() 和将其写成 while() 之间有一个细微的区别:您可以更改 continue 的行为。对于 for() 情况, continue 在检查条件之前执行增量步骤,而在 while() 中 continue 将直接跳回条件。 是的,非常好。另外,我认为人们忘记的是,当它结束时,所有循环都被编译成 GOTO 语句。 我认为这就是为什么 while 循环更经常导致无限循环错误的原因——增量步骤可以通过 continue 在某处跳过。 @Michael:是的,非常正确。 for 循环可能是作为方便和高效的方法引入的。 @Rup 一个很好的观点。我一直将 for 视为语法糖,但 continue 行为意味着它不是真的。【参考方案7】:

您应该使用最完全符合您需求的循环。 例如:

for(int i = 0; i < 10; i++)

    print(i);


//or

int i = 0;
while(i < 10)

    print(i);
    i++;

显然,在这种情况下,“for”看起来比“while”更好。 当某些操作必须在检查循环条件之前完成时,应该使用“do while”。

对不起,我的英语不好)。

【讨论】:

【参考方案8】:

我见过的对while/for 循环的一个常见误解是它们的效率不同。 While 循环和for 循环同样有效。我记得我高中的计算机老师告诉我,当你必须增加一个数字时,for 循环对迭代更有效。事实并非如此。

For 循环只是 syntactically sugared while 循环,可以更快地编写迭代代码。

当编译器获取您的代码并对其进行编译时,它会将其转换为计算机更容易理解并在较低级别(程序集)上执行的形式。在此翻译过程中,whilefor 语法之间的细微差别消失了,它们变得完全相同。

【讨论】:

“For 循环只是语法上的糖化 while 循环”:正如上面的 cmets 之一已经指出的那样,这并不完全正确。 for 中的 continue 不会绕过循环表达式(例如 for (i = 0 i &lt; limit ; i++) 中的 i++。【参考方案9】:

for 建议使用此方案的索引或变体进行固定迭代。

whiledo... while 是您在每次都必须检查条件时使用的构造(除了一些类似索引的构造,请参见上文)。它们的不同之处在于第一次执行条件检查的时间。

您可以使用任何一种构造,但根据您的用例,它们各有优缺点。

【讨论】:

【参考方案10】:

前段时间我注意到 For 循环通常比 while 循环生成更多的机器指令。但是,如果您仔细查看与我的观察结果相符的示例,您会发现差别只是两三个机器指令,几乎不值得考虑。

还要注意,WHILE 循环的初始化程序可以通过将其烘焙到代码中来消除,例如。 g.:

static int intStartWith = 100;

静态修饰符将初始值烘焙到代码中,保存(鼓)一个 MOV指令。更重要的是,将变量标记为静态会将其移出堆栈框架。在允许变量对齐的情况下,它也可能产生稍小的代码,因为 MOV 指令及其操作数比整数、布尔值或字符值(ANSI 或 Unicode)占用更多空间。

但是,如果变量在 8 字节边界上对齐,则常见的默认设置、嵌入代码的 int、bool 或 TCHAR 与 MOV 指令的字节数相同。

【讨论】:

【参考方案11】:

他们所做的工作都是一样的。您可以使用它们中的任何一个来做同样的事情。但在可读性、可用性、便利性等方面,它们是不同的。

【讨论】:

【参考方案12】:

while 和 do-while 之间的区别在于,while 检查循环条件,如果为真,则执行主体并再次检查条件。 do-while 会在 body 执行后检查条件,因此 do-while 会至少执行一次。

当然,您可以将 while 循环编写为 do-while 和 vv,但这通常需要一些代码重复。

【讨论】:

【参考方案13】:

do while 的一个特点是您需要在 while 之后使用分号来完成。它通常用于宏定义中,只执行一次几条语句,同时限制宏的影响。如果将宏定义为块,可能会出现一些解析错误。

One explanation among others

【讨论】:

虽然这太骇人听闻了,但这并不是do-while 存在的重要原因 不,我从来没有说过,但那是 do-while 的一种非常特别的用法,非常普遍。 @Michael 是的,这是一种 hack,但它确实是一种非常常用的方法,它使包含多个语句的宏在所有语法上下文中的行为完全符合预期。 @JeremyP 我知道,我也使用它,但它不是do-while 的真正用例,它只是因为它恰好创建一个块并且仍然需要在结束 我只是想指出 do-while 的这种特殊用法。部分问题是,有什么区别......这是一个区别。 (但我同意,这太骇人听闻了)【参考方案14】:

For 循环(至少考虑到 C99)优于 while 循环,因为它们限制了递增变量的范围。

当条件依赖于某些输入时,执行 while 循环很有用。它们是三种循环类型中最不常用的。

【讨论】:

【参考方案15】:

for 和 while 之间: while 不需要初始化也不需要更新语句,所以看起来可能更好,更优雅; for 可以缺少语句,一个两个或全部,因此如果您需要在循环之前进行初始化、循环条件和“更新”,这是最灵活和最明显的。如果您只需要循环条件(在循环开始时测试),那么while 更优雅。

在 for/while 和 do-while 之间:在 do-while 中,条件在循环结束时进行评估。如果循环必须至少执行一次,则更舒适。

【讨论】:

【参考方案16】:

WHILE 更灵活。 FOR 在适用的情况下更加简洁。

FOR 非常适合具有某种计数器的循环,例如

for (int n=0; n<max; ++n)

当然,正如其他人指出的那样,您可以使用 WHILE 完成同样的事情,但现在初始化、测试和增量被分成三行。如果循环的主体很大,可能是三个相距很远的线。这使读者更难看到你在做什么。毕竟,虽然“++n”是 FOR 中非常常见的第​​三部分,但它肯定不是唯一的可能性。我编写了许多循环,其中我编写了“n+=increment”或更复杂的表达式。

当然,FOR 也可以很好地处理计数器以外的东西。喜欢

for (int n=getFirstElementFromList(); listHasMoreElements(); n=getNextElementFromList())

等等

但是当“下一次循环”逻辑变得更加复杂时,FOR 就会崩溃。考虑:

initializeList();
while (listHasMoreElements())

  n=getCurrentElement();
  int status=processElement(n);
  if (status>0)
  
    skipElements(status);
    advanceElementPointer();
  
  else
  
    n=-status;
    findElement(n);
  

也就是说,如果前进的过程可能会根据处理时遇到的条件而有所不同,那么 FOR 语句是不切实际的。是的,有时你可以让它使用足够复杂的表达式,使用三元 ?: 运算符等,但这通常会降低代码的可读性而不是可读性。

在实践中,我的大多数循环要么是遍历数组,要么是某种结构,在这种情况下,我使用 FOR 循环;或者正在从数据库中读取文件或结果集,在这种情况下,我使用 WHILE 循环(“while (!eof())”或类似的东西)。

【讨论】:

如果 for 标头变长,只需在分号后分割行。这不是 while 而不是 for 的论据。 @klutt 涉及嵌套三元运算符和六级括号或一些相当复杂性的冗长且复杂的表达式的问题本身并不是因为行太长而无法放入编辑器窗口,而是它变得难以阅读和理解。 没错,但这与你选择哪种循环无关。 @klutt 当然可以。如果“下一个”操作涉及具有许多条件的复杂逻辑,则不能轻易将其置于 FOR 循环中。您必须有一个带有嵌套三元组或类似的复杂表达式,或者您必须从 FOR 语句中取出下一个并将其放入循环体中。此时,你不妨写一个 WHILE 循环。【参考方案17】:

除了do-while 循环之外,它们几乎相同。当您有 counter 类型的变量时,for 循环很好。这很明显。 while 循环在检查标志的情况下是有意义的,如下所示:

while (!done) 
   if (some condtion) 
      done = true;

【讨论】:

【参考方案18】:

whilefor 语句都可以用于编程中的循环。这取决于程序员是否使用while 循环或for 循环。有些人喜欢使用while 循环,有些人喜欢使用for 循环。

使用任何你喜欢的循环。但是,do...while loop can be somewhat tricky in C programming.

【讨论】:

whiledo whilefor 循环之间存在一致的差异。看看top answer,你就会找到它们。【参考方案19】:

/* while循环

5 美元

1 块巧克力 = 1 美元

while my money is greater than 1 bucks 
  select chocolate
  pay 1 bucks to the shopkeeper
  money = money - 1
end

回家后不能去购物,因为我的钱 = 0 美元 */

#include<stdio.h>
int main()
  int money = 5;

  while( money >= 1)   
    printf("inside the shopk and selecting chocolate\n");
    printf("after selecting chocolate paying 1 bucks\n");
    money = money - 1 ;  
    printf("my remaining moeny = %d\n", money);
    printf("\n\n");
  

  printf("dont have money cant go inside the shop, money = %d",  money);

  return 0;
 

无限金钱

while( codition ) // condition will always true ....infinite loop
  statement(s)

请观看此视频以更好地理解 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s

/* for循环

5 美元

for my money is greater than equal to 1 bucks   0      money >= 1
  select chocolate
  pay 1 bucks to the shopkeeper
  money = money - 1  1-1 => 0
end

*/

#include<stdio.h>
int main()

  int money = 5;
  for( ; money >= 1; )     0>=1  false 
    printf("select chocolate \n");
    printf("paying 1 bucks to the shopkeeper\n");
    money = money - 1;    1-1 = 0
    printf(" remaining money =%d\n", money);
    printf("\n\n");
  

  return 0;

如需进一步了解,请访问https://www.youtube.com/watch?v=_vdvyzzp-R4&t=25s

【讨论】:

以上是关于分别使用while、do-while和for语句编程,找出所有的水仙花数并输出。的主要内容,如果未能解决你的问题,请参考以下文章

三种循环语句的详解和使用(for,while,do-while)

do-while语句及for语句(初学者)

实验三:分别用forwhile和do-while循环语句以及递归方法计算n!,并输出算式

java基础语法学习day05---初学者必看详解

java基础语法学习day05---初学者必看详解

实验三:分别用for,while和do-while以及递归算法求n!