编程马拉松(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
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? 上面的没有Bug
完全不做修改的结果是奇数和
结果是2500
偶数和作如下修改
i:=i+2;//加2才是偶数
{ if i mod 2=0 then continue; // 这里多余注释掉}
j:=i+j;//这里是偶数和了
这样的结果是2550
页:
[1]