编写一个程序,从键盘读入一个数并判断其是否是偶数,若是偶数,则输出这个数,否则输出no。   将上一个程序改进,如果他输入的不是一个偶数,再给他一次机会输入,并判断第二次输入的是否是偶数,若依旧不是,输出no,若是输出第二个数。   读入一个小数,求出个位减去小数点后第一位的结果,例如输入8.677输出2
程序1(转义字符): #include <cstdio> #include <windows.h> int main(){ while(1){ Sleep(1000); printf("\a"); } return 0; } 程序2(浮点数转换): #include <iostream> using namespace std; int main(){ cout << 3/1.3 << endl;//分子是浮点数,结果也是浮点数 cout << 3.0/2 << endl;//分母是浮点数,结果也是浮点数 cout << 3/2 << endl;//分子分母都是整数,结果才是浮点数 int a = 3; cout << float(a)/2 << endl;//强制转换方式一 cout << (float)a/2 << endl; //强制转换方式二 cout << float(a/2) << endl; //错误方式 a/2会先计算得到结果1,再转换小数得1.0 return 0; }
import math import operator as op def tokenize(s): "序列化,在字符串的括号两边加上空格,使得字符串变得标准化,以便split" return s.replace('(',' ( ').replace(')',' ) ').split() def parse(program): return read_from_tokens(tokenize(program)) def atom(token): "对token进行转换" try: return int(token) except ValueError: try: return float(token) except ValueError: return str(token) def read_from_tokens(tokens): "处理tokenize传送过来的token数组" if len(tokens) == 0: raise SyntaxError('unexpected EOF while reading') token = tokens.pop(0)#获取左边第一个元素 if '(' == token: #合法标记,继续 arr = [] while tokens[0] != ')': arr.append(read_from_tokens(tokens))#递归处理tokens tokens.pop(0) return arr elif ')' == token: raise SystemError('unexpected )') else : return atom(token) class Env(dict): "环境类" def __init__(self, parms=(), args=(), outer = None): self.update(zip(parms, args)) self.outer = outer def find(self, var): "使用递归定义的查询变量方法" return self if (var in self) else self.outer.find(var) if self.outer is not None else None def standard_env(): "标准环境,通过序对表示" env = Env() env.update(vars(math))#注入数学库 env.update({ '+':op.add, '-':op.sub, '*':op.mul, '/':op.truediv, '>':op.gt, '<':op.lt, '>=':op.ge, '<=':op.le, '=':op.eq, 'abs': abs, 'append': op.add, 'begin': lambda *x: x[-1], 'car': lambda x: x[0], 'cdr': lambda x: x[1:], 'cons': lambda x,y: [x] + y, 'eq?': op.is_, 'equal?': op.eq, 'length': len, 'list': lambda *x: list(x), 'list?': lambda x: isinstance(x,list), 'map': map, 'max': max, 'min': min, 'not': op.not_, 'null?': lambda x: x == [], 'number?': lambda x: isinstance(x, (int, float)), 'procedure?': callable, 'round': round, 'symbol?': lambda x: isinstance(x, str), }) return env global_env = standard_env() class Procedure(object): "过程和求值构成元循环" def __init__(self, parms, body, env): "函数参数, 函数体,环境" self.parms, self.body, self.env = parms, body, env def __call__(self, *args): return eval(self.body, Env(self.parms, args, self.env)) def eval(x, env= global_env): "重头戏,最关键的求值器" if isinstance(x, str): "获取拥有x环境(字典)中的x的值" return env.find(x)[x] if env.find(x) is not None else 'Error: ' + x + ' Not defined' elif not isinstance(x, list): "迭代器,直接返回" return x elif x[0] == 'quote': "引用,丢弃标记,直接返回引用的值" (_, exp) = x return exp elif x[0] == 'if': "谓词逻辑" (_, test, conseq, alt) = x exp = (conseq if eval(test, env) else alt) return eval(exp, env) elif x[0] == 'define': "定义值" (_, var, exp) = x env[var] = eval(exp, env) elif x[0] == 'set!': "修改值" (_, var, exp) = x env.find(var)[var] = eval(exp, env) elif x[0] == 'lambda': (_, parms, body) = x return Procedure(parms, body, env) else: proc = eval(x[0], env) args = [eval(exp, env) for exp in x[1:]] return proc(*args) def lispstr(exp): "转换python对象,以便打印" if isinstance(exp, list): return '(' + ' '.join(map(lispstr, exp)) + ')' else: return str(exp) def repl(prompt='我的lisp> '): "循环求值器" while True: val = eval(parse(input(prompt))) if val is not None: print(lispstr(val)) if '__main__' == __name__: repl() 尝试一下 (define f (lambda (x) (if (< x 2) 1 (+ (f (- x 1) ) (f (- x 2) ))))) (f 5)
#include <graphics.h> #include <cmath> void control(int& x1,int& y1,int r1, int x2,int y2,int r2){ if(kbhit()){ char ch = getch(); if(ch == 'a') x1-=5; if(ch == 'd') x1+=5; if(ch == 'w') y1-=5; if(ch == 's') y1+=5; int deltax = abs(x1-x2),deltay = abs(y1-y2); int len = sqrt(deltax*deltax+deltay*deltay); if(len<r1+r2){ xyprintf(100,100,"碰撞了"); } } } int main(){ initgraph(640,480); int r1=20,r2=50; int x1=20,y1=20,x2=200,y2=200; while(is_run()){ circle(x1,y1,r1); circle(x2,y2,r2); control(x1,y1,r1,x2,y2,r2); delay_fps(60); cleardevice(); } closegraph(); return 0; }
#include <graphics.h> #include <cmath> void control(int& x1,int& y1,int w1,int h1,int x2,int y2,int w2,int h2){ if(kbhit()){ char ch = getch(); if(ch == 'a') x1-=5; if(ch == 'd') x1+=5; if(ch == 'w') y1-=5; if(ch == 's') y1+=5; if((abs((x1+w1/2)-(x2+w2/2))<(w1/2+w2/2)&&abs((y1+h1/2)-(y2+h2/2))<(h1/2+h2/2))){ xyprintf(100,100,"碰撞了"); } } } int main(){ initgraph(640,480); int w1 = 100, h1=40; int w2 = 100, h2=60; int x1=20,y1=20,x2=200,y2=200; while(is_run()){ rectangle(x1,y1,x1+w1,y1+h1); rectangle(x2,y2,x2+w2,y2+h2); control(x1,y1,w1,h1,x2,y2,w2,h2); delay_fps(60); cleardevice(); } return 0; }
#include <iostream> using namespace std; int arr[100]; void partition(int low, int hi, int& pivot){ int i, j; int temp; temp = arr[low]; j = low; for(i = low+1;i<=hi;i++) //从枢纽点后第一个数开始比较 if(arr[i]<temp){ //遇到比枢纽点小的 j++; //指针j向后移动 swap(arr[i], arr[j]);//并交换这两个元素 } //循环完毕 pivot = j; //快排递归需要的分割元素 swap(arr[low], arr[pivot]); //枢纽点就位,j就是猜测点应该呆的位置 } void quicksort(int low, int hi){ int pivot; if(hi > low){ partition(low, hi, pivot); quicksort(low, pivot-1);//排序枢纽点左侧 quicksort(pivot+1, hi); //排序枢纽点右侧 } } int main(int argc, char const *argv[]){ int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&arr[i]); quicksort(0, n-1); for (int i = 0; i < n; ++i) { cout <<arr[i]; } return 0; }
#include <cstdio> void merge( int h, int m, int* left, int* right, int *array){//合并两个数组 int i = 0, j = 0,k =0; while(i<h&&j<m){ if(left[i]<right[j]){ array[k] = left[k]; i++; } else { array[k] = right[k]; j++; } k++; } if(i==h){ for(int t=i;t<m;t++) array[k+t] = right[t]; } else { for(int t=j;t<h;t++) array[k+t] = left[t]; } } void mergesort(int n, int *array){//归并排序 if(n>1){ int h = n>>1, m = n - h; int left[h], right[m]; for(int i=0;i<h;i++) left[i] = array[i]; for(int i=0;i<m;i++) right[i] = array[h+i]; mergesort(h, left); mergesort(m, right); merge(h, m, left, right, array); } } int main(int argc, char const *argv[]) { int s[100]; int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&s[i]); mergesort(n, s); for (int i = 0; i < n; ++i) { /* code */ printf("%d ", s[i]); } return 0; }
#include <cstring> #include <cstdio> #define size 10 struct Event{ void (*events[size])() ={NULL};//回调函数数组 char str[size][100]; int top = 0; void callback(char *s, void (*func)()){ events[top] = func; strcpy(str[top],s); top++; } void handle(){ for(int i=0; i<top;i++){ events[i](); printf("%s\n", str[i]); } } }; void print(){ printf("hello\n" ); } int main(){ Event event; event.callback("test",print);//添加回调 event.handle(); //执行回调 return 0; }
#include <graphics.h> void compute(bool &r, bool& t, int& x, int& y, int rectx){ if(r){ x+=5; if(x==635) r=0; }else { x-=5; if(x==5) r=1; } if(t){ y+=5; if(x>=rectx&&x<=rectx+200&&y==465){ t=0; y-=5; } } else { y-=5; if(y<=0) t = 1; } if(y>465){ outtextxy(100,100,"你输了,按任意键开始"); if(kbhit()) y = 0; } } void moverect(int& x){ char ch; if(kbhit()){//判断输入 ch = getch();//把字符读入 if(ch =='a') x-=10; if(ch =='d') x+=10; } } int main(){ PIMAGE img; initgraph(640, 480); img = newimage(); getimage(img,"test.jfif");//加载图片到img画板,请替换成自己的图片 int x=100, y=100; bool r = 1; bool t = 1; int rectx = 400; //板子的x轴 setfillcolor(WHITE); while(is_run()){ xyprintf(100,100,"%f",getfps()); compute(r, t, x, y, rectx); //计算 fillellipse(x,y,10,10); moverect(rectx); rectangle(rectx,470,rectx+200,478); //画板子 delay_fps(60); cleardevice(); } delimage(img); //删除图像对象 closegraph(); return 0; }
题目:最长上升子序列 这是一道入门级动态规划题目,让我们尝试分析一波。 分析: 此处首先划分一下子问题,我们求解动态规划这类问题,首先可以划分一下子问题,再去找状态转移方程,最后写代码。 子问题:如果第n项能够与第n-1项的最长子序列构成一个更长子序列,那么第n项的最长子序列就是第n-1项的最长子序列加1,第一项的最长子序列是1。 状态转移方程: 设f[n]保存第n个数的最长序列,数组a保存数据 f[i] = max(f[i],f[i-1]+1) if a[i] > a[i-1] else f[i]=1 c++代码: #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define MAX 1000 int s[MAX]; int f[MAX]; int main(){ int n; cin >> n; memset(s, 0, sizeof(s)); memset(f,0,sizeof(f)); for(int i = 0; i < n; i++){ cin >> s[i]; f[i]=1; } for(int i = 0; i < n - 1; i++) for(int j = i + 1; j < n; j++) if(s[i] < s[j]) f[j] = max(f[j], f[i] + 1);//填充第n项的最长序列长度 cout <<*max_element(f,f+n)<< endl; //n个状态中的最大值 return 0; }