飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3232|回复: 2

编程马拉松(2)

[复制链接]

该用户从未签到

发表于 2007-8-12 07:51:34 | 显示全部楼层 |阅读模式
本贴引自第八阁论坛:http://bbs.chinadbg.cn/forum-7-1.html
还有飞翔技术论坛:http://www.powk.net/bbs/forumdisplay.php?fid=4&page=1

1到100奇数和或偶数和,思路:用循环从1到100,用求余“%”或取整“floor”判断是奇偶。
非常高兴看到大家的支持,你们发的程序,请在第二天加上注释。(主要是有错的程序)
这里主要让大家知道基础的变量初始化,条件判断,循环,和打印程序,还有基础的语法,还有一个任务找错!!。我写的是C代码,其它代码各个朋友自己理解一下,也可以PM发贴人。也可以发提问

以下是C代码,求[1到100的奇数或偶数和]
我写的是偶数,这个程序也有错啊!!!
  1. #include "stdio.h"
  2. #include <math.h>/*这里的两个头文件引用的方法不同,主要是区别在程序在编译是的寻找的范围*/
  3. main/*这里少了一个()*/
  4. {
  5.     int i,j=0;/*这里要改一下:int j=0; float i=0;*/
  6.     for( i=1; i<=100;i++)
  7.     {
  8.     if (i/2==floor(i/2))/*floor是取整函数,包函在math.h头文件中*/
  9.     {
  10.     j+=i;
  11.     }
  12. }
  13. printf("%d\n",j);
  14. getch();
  15. }
复制代码
java 代码 求1-100的偶数和
  1. public static void main(String[] args){
  2.      int sum = 0;
  3.      for(int i=2;i<=100;i++){
  4.           if(i%2==0)
  5.                sum = sum+i;
  6.      }
  7.      System.out.println("The sum is "+sum);
  8. }
复制代码
VC滴:这里C的别一种写法可以用%求余来做奇偶断定
  1. #include "stdio.h"

  2. void main()
  3. {
  4.         unsigned short sum_odd =0;
  5.         unsigned short sum_even = 0;

  6.         for (int i = 1; i <= 100; i++)//从1--100,呵呵,注释够详细了吧
  7.         {
  8.                 if (0 == i%2)//判断是否偶数
  9.                 {
  10.                         sum_even += i;//偶数累加
  11.                 }
  12.                 else
  13.                         sum_odd += i;//奇数累加
  14.         }
  15.         printf("The sum of even number is %d\n", sum_even);
  16.         printf("The sum of odd number is %d\n", sum_odd);
  17. }
复制代码
DELPHI的写法,也看到了别一个循环的用法,在其它语言中一样可以用。
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   i,j:Integer;
  4. begin
  5.   j:=0;
  6.   i:=0;
  7.   while i<100 do
  8.   begin
  9.     i:=i+1;
  10.     if i mod 2=0 then continue; // x mod Y 结果为X除于Y的余数; continue 直接执行下一个循环
  11.     j:=i+j;
  12.   end;
  13.   Button1.Caption:=IntToStr(j);//用按键名显示结果
  14. end;
复制代码
我也来凑凑,
下面是VB写的
  1. Dim ji As Integer
  2. Dim ou As Integer
  3. Dim i As Integer
  4. ji = 0
  5. ou = 0
  6. For i = 1 To 100            '这是FOR语句循环
  7.   If i Mod 2 = 0 Then     ’判断是否奇偶
  8.      ji = ji + i
  9.   Else
  10.      ou = ou + i
  11.   End If
  12. Next
  13. Print ji                         ’输出奇数
  14. Print ou
复制代码
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; Sample code for < Win32ASM Programming >
  3. ; by
  4. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  5. ; Sum.asm
  6. ; 求1+2+3……100中偶数和奇数的和
  7. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  8. ; 使用 nmake 或下列命令进行编译和链接:
  9. ; ml /c /coff Sum.asm
  10. ; rc Sum.rc
  11. ; Link /subsystem:windows Sum.obj Sum.res
  12. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  13.                 .386
  14.                 .model flat, stdcall
  15.                 option casemap :none
  16. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  17. ; Include 文件定义
  18. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  19. include                windows.inc
  20. include                user32.inc
  21. includelib        user32.lib
  22. include                kernel32.inc
  23. includelib        kernel32.lib
  24. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  25. ; 数据段
  26. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  27.                 .data

  28. szBuffer        byte    1024 dup (?)     
  29.                 .const
  30. fmt         db      "偶数和是:%d     奇数和是:%d", 0
  31. szCaption   db      "求1+2+3……100中偶数和奇数的和", 0
  32. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  33. ; 代码段
  34. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  35.                 .code

  36. start:        
  37.                         
  38.                         mov eax, 0
  39.                         mov ebx, 0
  40.                         mov ecx, 1
  41.         
  42.         LP:                test ecx, 01
  43.                         jne L_ODD
  44.                         
  45.                         add eax, ecx
  46.                         
  47.                         jmp L_NEXT
  48.                         
  49. L_ODD:                add ebx, ecx
  50. L_NEXT:                inc ecx
  51.                         cmp ecx, 100
  52.                         jle LP
  53.                         
  54.                         invoke wsprintf, addr szBuffer, addr fmt, eax, ebx
  55.                         invoke        MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
  56.                         invoke        ExitProcess,NULL
  57. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  58.                 end        start
复制代码
我来个汇编的~无错的~上面有人发过了,我改进一下,主要是.if   .while 这些Masm伪指令的使用,以及Masm32里macros.asm里提供的几个宏的使用~~~
  1. .586
  2. .model flat,stdcall
  3. option casemap:none

  4. include windows.inc
  5. include user32.inc

  6. includelib user32.lib

  7. include D:\Program Files\RadASM\Masm32\macros\macros.asm     ;这个是我电脑里的路径,自己改改~~macros.asm里提供了很多方便的宏~推荐自己打开来看一下

  8. .data?
  9.         
  10.         szMsg                db                56 dup(?)
  11.         
  12. .code
  13. Main proc
  14.         
  15.         xor eax,eax
  16.         xor ebx,ebx
  17.         mov ecx,1
  18.         .while ecx <= 100
  19.                 .if ecx & 1
  20.                         add eax,ecx
  21.                 .else
  22.                         add ebx,ecx
  23.                 .endif
  24.                 inc ecx
  25.         .endw
  26.         invoke wsprintf,offset szMsg, SADD('奇数和:%d,偶数和:%d'), eax, ebx
  27.         invoke MessageBox,NULL, offset szMsg, offset szMsg, MB_OK or MB_ICONINFORMATION
  28.         ret

  29. Main endp
  30. end Main
复制代码
既然是逆向小组,我们怎么也得来点反汇编了吧,下面是反汇编HH写的汇编语言的代码
  1. 00401000  mov     eax, 0
  2. 00401005  mov     ebx, 0
  3. 0040100A  mov     ecx, 1
  4. 0040100F  test    ecx, 1                             ;判断ECX中的数是否偶
  5. 00401015  jnz     short 0040101B
  6. 00401017  add     eax, ecx                          ;偶数相加
  7. 00401019  jmp     short 0040101D
  8. 0040101B  add     ebx, ecx                          ;奇数相加
  9. 0040101D  inc     ecx                                   
  10. 0040101E  cmp     ecx, 64                            ;与64H=100D比较判断是否到了最大范围
  11. 00401021  jle     short 0040100F
  12. 00401023  push    ebx                              ; <%d>     压入wsprintfA的参数1(偶数和)
  13. 00401024  push    eax                              ; <%d>     压入wsprintfA的参数2(奇数和)
  14. 00401025  push    00402014                         ; Format = "偶数和是:%d     奇数和是:%d"
  15. 0040102A  push    00403000                         ; s = 2131.00403000
  16. 0040102F  call    <jmp.&user32.wsprintfA>          ; wsprintfA
  17. 00401034  add     esp, 10
  18. 00401037  push    0                                ; Style = MB_OK|MB_APPLMODAL
  19. 00401039  push    00402030                         ; Title = "求1+2+3",A1,"",AD,"",A1,"",AD,"100中偶数和奇数的和"
  20. 0040103E  push    00403000                         ; Text = ""
  21. 00401043  push    0                                ; hOwner = NULL
  22. 00401045  call    <jmp.&user32.MessageBoxA>        ; MessageBoxA
  23. 0040104A  push    0                                ; ExitCode = 0
  24. 0040104C  call    <jmp.&kernel32.ExitProcess>      ; ExitProcess
  25. 00401051  int3
  26. 00401052  jmp     dword ptr [<&user32.wsprintfA>]  ;  user32.wsprintfA
  27. 00401058  jmp     dword ptr [<&user32.MessageBoxA>>;  user32.MessageBoxA
  28. 0040105E  jmp     dword ptr [<&kernel32.ExitProces>;  kernel32.ExitProcess
复制代码
原帖由 21st[P.Y.G] 于 2007-8-12 00:13 发表
我也继续~
language: c

#include
int main()
{
  printf("偶数和:%d\n",(2+100)*((100-2)/2+1)/2);
  printf("奇数和:%d\n",(1+99)*((99-1)/2+1)/2);
  return 0;
}

1 高斯小学时候发明的公式:等差数列和=(首项+末项)*项数/2
2 stdio.h是c的。你c++用它是多此一举。
3 iOStream.h是老库,不需要标准名字空间。
4 void main(),不管是c还是c++,这种写法都是绝对的错误。 main函数必须返回int
PYG19周年生日快乐!

该用户从未签到

发表于 2007-8-12 18:09:30 | 显示全部楼层
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:Integer;
begin
  j:=0;
  i:=0;
  while i<100 do
  begin
    i:=i+1;//这里是奇数还是偶数?按你的算法来应该是奇数和了
    if i mod 2=0 then continue; // x mod Y 结果为X除于Y的余数; continue 直接执行下一个循环
    j:=i+j;//这里是偶数和了
  end;
  Button1.Caption:=IntToStr(j);//用按键名显示结果,这里显示的偶数的和,那你的奇数的和类?不用显示么?题目不是要算出来奇数和偶数的和么?
end;

你这算法是不是有那么点点的bug?
PYG19周年生日快乐!

该用户从未签到

发表于 2007-8-12 23:12:51 | 显示全部楼层
上面的没有Bug

完全不做修改的结果是奇数和
结果是2500
偶数和作如下修改
  i:=i+2;//加2才是偶数
   { if i mod 2=0 then continue; // 这里多余注释掉}
    j:=i+j;//这里是偶数和了

这样的结果是2550
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表