freesoft 发表于 2007-8-12 07:51:34

编程马拉松(2)

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

void main()
{
      unsigned short sum_odd =0;
      unsigned short sum_even = 0;

      for (int i = 1; i <= 100; i++)//从1--100,呵呵,注释够详细了吧
      {
                if (0 == i%2)//判断是否偶数
                {
                        sum_even += i;//偶数累加
                }
                else
                        sum_odd += i;//奇数累加
      }
      printf("The sum of even number is %d\n", sum_even);
      printf("The sum of odd number is %d\n", sum_odd);
}DELPHI的写法,也看到了别一个循环的用法,在其它语言中一样可以用。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;我也来凑凑,
下面是VB写的Dim ji As Integer
Dim ou As Integer
Dim i As Integer
ji = 0
ou = 0
For i = 1 To 100            '这是FOR语句循环
If i Mod 2 = 0 Then   ’判断是否奇偶
   ji = ji + i
Else
   ou = ou + i
End If
Next
Print ji                         ’输出奇数
Print ou;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sum.asm
; 求1+2+3……100中偶数和奇数的和
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Sum.asm
; rc Sum.rc
; Link /subsystem:windows Sum.obj Sum.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib      user32.lib
include                kernel32.inc
includelib      kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data

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

start:      
                        
                        mov eax, 0
                        mov ebx, 0
                        mov ecx, 1
      
      LP:                test ecx, 01
                        jne L_ODD
                        
                        add eax, ecx
                        
                        jmp L_NEXT
                        
L_ODD:                add ebx, ecx
L_NEXT:                inc ecx
                        cmp ecx, 100
                        jle LP
                        
                        invoke wsprintf, addr szBuffer, addr fmt, eax, ebx
                        invoke      MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
                        invoke      ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end      start我来个汇编的~无错的~上面有人发过了,我改进一下,主要是.if   .while 这些Masm伪指令的使用,以及Masm32里macros.asm里提供的几个宏的使用~~~.586
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc

includelib user32.lib

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

.data?
      
      szMsg                db                56 dup(?)
      
.code
Main proc
      
      xor eax,eax
      xor ebx,ebx
      mov ecx,1
      .while ecx <= 100
                .if ecx & 1
                        add eax,ecx
                .else
                        add ebx,ecx
                .endif
                inc ecx
      .endw
      invoke wsprintf,offset szMsg, SADD('奇数和:%d,偶数和:%d'), eax, ebx
      invoke MessageBox,NULL, offset szMsg, offset szMsg, MB_OK or MB_ICONINFORMATION
      ret

Main endp
end Main既然是逆向小组,我们怎么也得来点反汇编了吧,下面是反汇编HH写的汇编语言的代码00401000mov   eax, 0
00401005mov   ebx, 0
0040100Amov   ecx, 1
0040100Ftest    ecx, 1                           ;判断ECX中的数是否偶
00401015jnz   short 0040101B
00401017add   eax, ecx                        ;偶数相加
00401019jmp   short 0040101D
0040101Badd   ebx, ecx                        ;奇数相加
0040101Dinc   ecx                                 
0040101Ecmp   ecx, 64                            ;与64H=100D比较判断是否到了最大范围
00401021jle   short 0040100F
00401023push    ebx                              ; <%d>   压入wsprintfA的参数1(偶数和)
00401024push    eax                              ; <%d>   压入wsprintfA的参数2(奇数和)
00401025push    00402014                         ; Format = "偶数和是:%d   奇数和是:%d"
0040102Apush    00403000                         ; s = 2131.00403000
0040102Fcall    <jmp.&user32.wsprintfA>          ; wsprintfA
00401034add   esp, 10
00401037push    0                              ; Style = MB_OK|MB_APPLMODAL
00401039push    00402030                         ; Title = "求1+2+3",A1,"",AD,"",A1,"",AD,"100中偶数和奇数的和"
0040103Epush    00403000                         ; Text = ""
00401043push    0                              ; hOwner = NULL
00401045call    <jmp.&user32.MessageBoxA>      ; MessageBoxA
0040104Apush    0                              ; ExitCode = 0
0040104Ccall    <jmp.&kernel32.ExitProcess>      ; ExitProcess
00401051int3
00401052jmp   dword ptr [<&user32.wsprintfA>];user32.wsprintfA
00401058jmp   dword ptr [<&user32.MessageBoxA>>;user32.MessageBoxA
0040105Ejmp   dword ptr [<&kernel32.ExitProces>;kernel32.ExitProcess
原帖由 21st 于 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

小子贼野 发表于 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?

laoliu 发表于 2007-8-12 23:12:51

上面的没有Bug

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

这样的结果是2550
页: [1]
查看完整版本: 编程马拉松(2)