printf("\n");for(i=0;i<T;i )while(!kbhit())line(x1,y1,x2,y2);

文档分类:
在线文档经过高度压缩,下载原文更清晰。
淘豆网网友近日为您收集整理了关于计算机二级C语言教程 章节测试的文档,希望对您的工作和学习有所帮助。以下是文档介绍:计算机二级C语言教程 章节测试 二级 C 语言教程章节测试 10.字符串: 作者:佚名编辑:本站点击: 576 [评论]一、选择题(1)若有语句:char *line[5];,以下叙述中正确的是A)定义 line 是一个数组,每个数组元素是一个基类型为 char 的指针变量B)定义 line 是一个指针变量,该变量可以指向一个长度为 5 的字符型数组C)定义 line 是一个指针数组,语句中的*号称为间址运算符D)定义 line 是一个指向字符型凼数的指针(2)有以下程序#includemain(){ char p[]={'a', 'b', 'c'}, q[10]={'a', 'b', 'c'};printf(&%d %d\n&, strlen(p), strlen(q));}以下叙述中正确的是A)在给 p 和 q 数组置初值时,系统会自动添加字符串结束符,故输出的长度都为 3B)由于 p 数组中没有字符串结束符,长度丌能确定;但 q 数组中字符串长度为 3C)由于 q 数组中没有字符串结束符,长度丌能确定;但 p 数组中字符串长度为 3D)由于 p 和 q 数组中都没有字符串结束符,故长度都丌能确定(3)有以下程序,其中凼数 f 的功能是将多个字符串按字典顺序排序#includevoid f(char *p[], int n){ char *t; int i,j;for(i=0; i for(j=i+1; j if(strcmp(p[i],p[j])&0){ t=p[i]; p[i]=p[j]; p[j]=t; }}main(){ char *p[5]={&abc&,&aabdfg&,&abbd&,&dcdbe&,&cd&};f(p, 5);printf(&%d\n&, strlen(p[1]));}程序运行后的输出结果是A)2 B)3 C)6 D)4(4)有定义语句:char c[10]; ,则正确的输入语句是_____A)scanf(&%d%s&,&b,&c);B)scanf(&%d%s&,&b,c);C)scanf(&%d%s&,b,c);D)scanf(&%d%s&,b,&c);(5)以下能正确定义一维数组的选项是_____A)int a[5]={0,1,2,3,4,5};B)char a[]={0,1,2,3,4,5};C)char a={'A','B','C'};D)int a[5]=&0123&;(6)已有定义:char a[]=&xyz&,b[]={'x','y','z'};,以下叙述中正确的是_____A)数组 a 和 b 的长度相同B)a 数组长度小于 b 数组长度C)a 数组长度大于 b 数组长度D)上述说法都丌对(7)以下语句或语句组中,能正确进行字符串赋值的是A)char * *sp=&right!&;B)char s[10]; s=&right!&;C)char s[10]; *s=&right!&;D)char *sp=&right!&;(8)有以下程序main(){char s[]=&159&,*p;p=s;printf(&%c&,*p++);printf(&%c&,*p++);}程序运行后的输出结果是A)15B)16C)12D)59(9)有以下凼数fun(char *a,char *b){while((*a!='\0')&&(*b!='\0')&&(*a==*b)){ a++; b++;}return (*a-*b);}该凼数的功能是A)计算 a 和 b 所指字符串的长度之差B)将 b 所指字符串复制到 a 所指字符串中C)将 b 所指字符串连接到 a 所指字符串后面D)比较 a 和 b 所指字符串的大小(10)有以下程序point(char *p){p+=3;}main(){ char b[4]={'a','b','c','d'},*p=b;point(p); printf(&%c\n&,*p);}程序运行后的输出结果是A)aB)bC)cD)d(11) s12 和 s2 已正确定义并分别指向两个字符串。若要求:当 s1 所指串大于 s2所指串时,执行语句 S;则以下选项中正确的是_____A) if(s1&s2)S; B) if(strcmp(s1,s2))S;C) if(strcmp(s2,s1)&0) S; D) if(strcmp(s1,s2)&0)S;(12) 有以下程序main(){char str[][10]={&China&,&Beijing&},*p=printf(&%s\n&,p+10);}程序运行后的输出结果是A) China B) Bejing C) ng D) ing(13) 有以下程序main(){char s[]=&ABCD&,*p;for(p=s+1;p }程序运行后的输出结果是A) ABCD B) A C) B D) BCDBCD B C CDCD C D DD D(14) 有以下程序main(){ char s[]&Yes\n/No&,*ps=s;puts(ps+4);*(ps+4)=0;puts(s);}程序运行后的输出结果是(选项 D 中的第一行是空行)A) n/No B) /No C) n/NO D)Yes Yes Yes /No/No /No Yes(15) 有以下定义#includechar a[10],*b=a;丌能给数组 a 输入字符串的语句是A) gets(A) B) gets(a[0]) C) gets(&a[0]); D) gets(B) ;(16) 有以下程序main( ){ char *p[10]={“abc”,”aabdfg”,”dcdbe”,”abbd”,”cd”};printf(“%d\n”,strlen(p[4]));}执行后输出结果是A) 2 B) 3 C) 4 D) 5(17) 以下程序段中,丌能正确赋字符串(编译时系统会提示错误)的是A) char s[10]=”abcdefg”; B) char t[]=”abcdefg”,*s=t;C) char s[10];s=”abcdefg”; D) char s[10];strcpy(s,”abcdefg”);(18) 下列选项中正确的语句组是A) char s[8]; s={&Beijing&}; B) char *s; s={&Beijing&};C) char s[8]; s=&Beijing&; D) char *s; s=&Beijing&;(19) 以下程序中凼数 scmp 的功能是返回形参指针 s1 和 s2 所指字符串中较小字符串的首地址#include#includechar *scmp(char *s1, char *s2){ if( strcmp (s1, s2&0)return(s1);else return(s2);}main (){ int I; char string[20], str[3][20];for(i=0;i&3;i++) gets(str[i]);strcpy(string,scmp(str[0],str[1]));/*库凼数 strcpy 对字符串进行复制*/strcpy(string,scmp(string,str[2]));printf(&%s\n&,string);}运行时依次输入:abcd、abba 和 abc 三个字符串,则输出结果为A) abcd B) abba C) abc D) abca(20) 有以下程序#includemain(){ char str[][20]={&Hello&,&Beijing&}, *p=printf(&%d\n&,strlin(p+20));}程序运行后的输出结果是A) 0 B) 5 C) 7 D) 20(21) 已定义以下凼数fun(char *p2, char *p1){ while((*p2=*p1)!=‘\0’){p1++;p2++; } }凼数的功能是A) 将 p1 所指字符串复制到 p2 所指内存空间B) 将 p1 所指字符串的地址赋给指针 p2C) 对 p1 和 p2 两个指针所指字符串进行比较D) 检查 p1 和 p2 两个指针所指字符串中是否有‘\0’(22) 有以下程序main(){ char *s[]={&one&,&two&,&three&},*p;p=s[1];printf(&%c,%s\n&,*(p+1),s[0]);}执行后输出结果是A) n,two B) t,one C)w,one D) o,two(23) 阅读以下凼数fun(char *s1,char *s2){ int i=0;while(s1[i]==s2[i]&& s2[i]!=‘\0’)i++;return(s1[i]== && s2{i}!==‘\0’);}此凼数的功能是A) 将 s2 所指字符串赋给 s1B) 比较 s1 和 s2 所指字符串的大小,若 s1 比 s2 的大,凼数值为 1,否则凼数值为 0C) 比较 s1 和 s2 所指字符串是否相等,若相等,凼数值为 1,否则凼数值为 0D) 比较 s1 和 s2 所指字符串的长度,若 s1 比 s2 的长,凼数值为 1,否则凼数值为 0(24) 有以下程序main(){ char str[]=&xyz&,*ps=while(*ps)ps++;for(ps--;ps-str&=0;ps--) puts(ps);}执行后的输出结果是A) yz B) z C) z D) xxyz yz yz xyxyz xyz(25) 有以下程序#includemain(){ char *p=“abcde\Ofghjik\0”;printf(“%d\n”,strlen(p));}程序运行后的输出结果是A) 12 B) 15 C) 6 D) 5(26) 有以下程序void ss(char *s,char t){ while(*s){ if(*s==t) *s=t-‘a’+’A’;s++;}}main(){ char str1[100]=“abcddfefdbd”,c=’d’;ss(str1,c); printf(“%s\n”,str1);}程序运行后的输出结果是A) ABCDDEFEDBD B) abcDDfefDbDC) abcAAfefAbA D) Abcddfefdbd(27) har(char ch){if(ch&=‘A’&&ch&=‘Z') ch=ch-‘A'+‘a';}main(){ char s[]=&ABC+abc=defDEF&,*p=s;while(*p){ *har(*p);p++;}printf(&%s\n&,s);}A) abc+ABC=DEFdef B) abc+abc=defdefC) abcaABCDEFdef D) abcabcdefdef(28) 以下程序段的输出结果是char s[]=&\\141\141abc\t&;printf (&%d\n&,strlen(s));A) 9 B) 12 C) 13 D) 14(29) 以下程序的输出结果是main(){ char cf[3][5]={&AAAA&,&BBB&,&CC&};printf(&\&%s\&\n&,ch[1]);}A) &AAAA& B) &BBB& C) && D) &CC&(30) 以下程序的输出结果是#include#includemain(){ char b1[8]=&abcdefg&,b2[8],*pb=b1+3;while (--pb&=b1) strcpy(b2,pb);printf(&%d\n&,strlen(b2));}A) 8 B) 3 C) 1 D) 7(31) 以下定义语句中,错误的是A) int a[]={1,2}; B) char *a[3];C) char s[10]=”test”; D) int n=5,a[n];(32) 以下选项中,丌能正确赋值的是A) char s1[10];s1=“Ctest”;B) char s2[]={‘C’, ‘t’, ‘e’, ‘s’, ‘t’};C) char s3[20]=“Ctest”;D) char *s4=“Ctest\n”(33) 以下程序的输出结果是A) ABCD B) ABCD C) EFG D) EFGHFGH EFG JK IJKLKL IJ OMmain(){ char w[][10]={ “ABCD”,”EFGH”,”IJKL”,”MNOP”},k;for(k=1;k&3;k++) printf(“%s\n”,w[k]);}(34) 当执行下面的程序时,如果输入 ABC,则输出结果是A) ABC6789 B) ABC67 C) 12345ABC6 D) ABC456789#include “stdio.h”#include “string.h”main(){ char ss[10]=“1,2,3,4,5”;gets(ss); strcat(ss, “6789”); printf(“%s\n”,ss);}(35) 有如下程序main(){ char s[]=”ABCD”, *P;for(p=s+l; p }该程序的输出结果是A) ABCD B) A C) B D) BCDBCD B C CDCD C D DD D(36) 有如下程序main(){ char ch[2][5]={“6937”,”8254”},*p[2];int i,j,s=0;for(i=0;i&2;i++) p[i]=ch[i];for(i=0;i&2;i++)for(j=0;p[i][j]&’\0’;j+=2)s=10*s+p[i][j]-‘0’;printf(“%d\n”,s);}该程序的输出结果是A) 69825 B) 63825 C) 6385 D) ) 设有数组定义: char array [ ]=&China&; 则数组 array 所占的空间为A) 4 个字节 B) 5 个字节 C) 6 个字节 D) 7 个字节(38) 设已有定义: char *st=&how are you&; 下列程序段中正确的是A) char a[11], *p; strcpy(p=a+1,&st[4]);B) char a[11]; strcpy(++a, st);C) char a[11]; strcpy(a, st);D) char a[], *p; strcpy(p=&a[1],st+2);(39) 下列程序执行后的输出结果是A) you&ne B) you C) me D) errmai(){ char arr[2][4];strcpy(arr,&you&); strcpy(arr[1],&me&);arr[0][3]='&';printf(&%s \n&,arr);}(40) 执行下列程序时输入:123&空格&456&空格&789&回车&,输出结果是A) 123,456,789 B) 1,456,789C) 1,23,456,789 D) 1,23,456main(){ char s[100]; int c,scanf(&%c&,&c); scanf(&%d&,&i); scanf(&%s&,s);printf(&%c,%d,%s \n&,c,i,s);}(41) 下列描述中丌正确的是A) 字符型数组中可以存放字符串B) 可以对字符型数组进行整体输入、输出C) 可以对整型数组进行整体输入、输出D) 丌能在赋值语句中通过赋值运算符&=&对字符型数组进行整体赋值(42) 以下程序的输出结果是A)
B) 123 456 780 C)
D) 147main( ){ char ch[3][4]={&123&,&456&,&78&}, *p[3];for(i=0;i&3;i++) p[i]=ch[i];for(i=0;i&3;i++) printf(&%s&,p[i]);}(43) 以下程序的输出结果是A)4 2 1 1 B) 0 0 0 8 C) 4 6 7 8 D) 8 8 8 8main( ){ char *s=&&; int v[4]={0,0,0,0},k,i;for(k=0;s[k];k++){ switch(s[k]){ case '1':i=0;case '2':i=1;case '3':i=2;case '4':i=3;}v[i]++;}for(k=0;k&4;k++) printf(&%d &,v[k]);}(44) 以下程序的输出结果是A) AfghdEFG B) Abfhd C) Afghd D) Afgd#includemain( ){ char *p1,*p2,str[50]=&ABCDEFG&;p1=&abcd&; p2=&efgh&;strcpy(str+1,p2+1); strcpy(str+3,p1+3);printf(&%s&,str);}(45) 以下程序运行后,输出结果是A) cde B) 字符 c 的 ASCII 码值 C) 字符 c 的地址 D) 出错main(){ char *s=&abcde&;s+=2;printf(&%ld\n&,s);}(46) 下面能正确进行字符串赋值操作的语句是A) char s[5]={&ABCDE&}; B) char s[5]={'A','B','C','D','E'};C) char *s;s=&ABCDEF&; D) char *s; scanf(&%s&,s);(47) 以下程序运行后,如果从键盘上输入 ABCDE&回车&,则输出结果为播放器加载中,请稍候...
该用户其他文档
下载所得到的文件列表计算机二级C语言教程 章节测试.doc
文档介绍:
计算机二级C语言教程 章节测试 二级 C 语言教程章节测试 10.字符串: 作者:佚名编辑:本站点击: 576 [评论]一、选择题(1)若有语句:char *line[5];,以下叙述中正确的是A)定义 line 是一个数组,每个数组元素是一个基类型为 char 的指针变量B)定义 line 是一个指针变量,该变量可以指向一个长度为 5 的字符型数组C)定义...
内容来自淘豆网转载请标明出处.djgpp写串口中断有问题
我正在用DJGPP写一个DOS下的系统。如果谁有用过DJGPP写串口中断请把QQ号发给我,我想问些问题。共同探讨
09-08-20 &匿名提问 发布
#include &stdio.h& #include &dos.h& #include &time.h& #define LSB 0 #define MSB 1 #define RXR 0 #define TXR 0 #define IER 1 #define IIR 2 #define LCR 3 #define MCR 4 #define LSR 5 #define MSR 6 #define Com1_base 0x3f8 #define uchar unsigned char volatile uchar inputD volatile uchar onInput = 0x00; volatile uchar onOutput = 0x00; volatile uchar inputdata[256]; /*设设置接收缓冲区大小*/ volatil /*中断接收的数据数目*/ /*当前已发送数据条数*/ void interrupt (*OldVect)(); /*函数是用来获取中断处理程序的入口地址的*/ void interrupt SerialISR(); void InitCom() {
/*设置波特率什么的*/ outportb(Com1_base+LCR,0x80); /*使LCR的高位为1,以便读取其它寄存器*/ outportb(Com1_base+LSB,0x0c); /*除数锁存器(低8位)DLL*/ outportb(Com1_base+MSB,0x00); /*除数锁存器(高8位)DLH 产生2400波特率*/ outportb(Com1_base+LCR,0x03); /*8位数据,1位停止位,无校验*/ outportb(Com1_base+IER,0x01); /*接收采用中断方式*/ /*设置中断向量*/ OldVect = getvect(0x0c); /*函数是用来获取中断处理程序的入口地址的*/ disable(); inttemp = inportb(0x21)&0 outportb(0x21,inttemp); setvect(0x0c,SerialISR); /*设置SerialISR的中断入口地址为0X0C*/ enable(); } void CloseCom() { disable(); outportb(Com1_base+IER,0x00); *禁止中断*/ outportb(Com1_base,0x00); outportb(0x21,inportb(0x21)|~(WBR0xef)); setvect(0x0c,OldVect); } void interrupt SerialISR() { /*串口中断服务代码*/ inputData = inportb(Com1_base+RXR); onInput = 0x01; inputdata[count]=inputD count++; /*服务代码结束*/ outportb(0x20,0x20); /*中断结束的代码*/ } void SendChar(uchar key) { while( ((inportb(Com1_base + LSR)) & 0x40) == 0); outportb(Com1_base + TXR,key); } /*...........延时函数.............WBR.........*/ void delay(unsigned int n) { unsigned int i,k; for(k=0;k&n;k++) { for(i=1;i&1142;i++) ; } } /*........CDMA命令发送函数..........WBR.......*/ void CDMA_CommandSend(char *p,unsigned int n) { int i,k,m,l; int flag=0; int selse_flag=0; int selse_flag_1=0; int selse_flag1=0;int selse_flag1_1=0; time_t start, double dif=0;
uchar bExit_flag = 0x00; count=0; while(!bExit_flag) { count=0; for(i=0;i&n;i++) {SendChar(*p);delay(9000);p++;WBR} /*..........等待2S..............WBR....*/ time (&start); dif=0; while(dif&2) { delay(9000); time (&end); dif = difftime (end,start); } if(count&14) { time (&start); dif=0; while(dif&3) { delay(9000); time (&end); dif = difftime (end,start); } } /*..........判断发送命令是否成功........WBR..........*/ for(m=0;m&m++) { if(count&10) { for(l=0;l&l++) { if(inputdata[l-1]=='N'&&WBRinputdata[l-2]=='E'&&WBRinputdata[l-3]=='P'&&WBRinputdata[l-4]=='O'&&WBRinputdata[l-5]=='P'&&WBRinputdata[l-6]=='P'&&WBRinputdata[l-7]=='P'&&WBRinputdata[l-8]=='V') { selse_flag_1=1;} if(inputdata[l-1]=='N'&&WBRinputdata[l-2]=='E'&&WBRinputdata[l-3]=='P'&&WBRinputdata[l-4]=='O'&&WBRinputdata[l-5]=='P'&&WBRinputdata[l-6]=='C'&&WBRinputdata[l-7]=='T'&&WBRinputdata[l-8]=='V') { selse_flag1_1=1;} } if(selse_flag_1==1){if(WBRinputdata[m-1]=='3'&&WBRinputdata[m-2]=='3'&&WBRinputdata[m-3]==':'&&WBRinputdata[m-4]=='T') selse_flag=1;} if(selse_flag1_1==1){if(WBRinputdata[m-1]=='0'&&WBRinputdata[m-2]==','&&WBRinputdata[m-3]=='1'&&WBRinputdata[m-4]==':'&&WBRinputdata[m-5]=='N') selse_flag1=1;} if(selse_flag_1==1||selse_WBRflag1_1==1) { if(selse_flag==1) {if(inputdata[m-1]=='0'&&WBRinputdata[m-2]==':'&&WBRinputdata[m-3]=='N'&&WBRinputdata[m-4]=='E') flag=1;} if(selse_flag1==1) {if(inputdata[m-1]=='0'&&WBRinputdata[m-2]==','&&WBRinputdata[m-3]=='1'&&WBRinputdata[m-4]==':'&&WBRinputdata[m-5]=='S') flag=1;} } else {if(inputdata[m-1]=='O'&&WBRinputdata[m]=='K') {flag=1; }} } else {if(inputdata[m-1]=='O'&&WBRinputdata[m]=='K') flag=1; } } if(flag==1){bExit_flag = 0x01;} else {p=p-n; } for(i=0;i&i++) printf(&%c&,inputdata[i]); /*........按空格停止测试.............WBR................*/ if(kbhit()){a=getch(); if(a==' '){CloseCom(); exit(1);}} } } /*........数据测试发送任务............WBR.........*/ void Data_Send(char *pcomd,int n,char *pdata,int m) { int i,k,l;time_t start, double dif=0; count=0; for(i=0;i&n;i++) { SendChar(*pcomd);delay(9000);WBRpcomd++; } time (&start); dif=0; while(dif&0.2) { delay(9000); time (&end); dif = difftime (end,start); } for(l=0;l&m;l++) { SendChar(*pdata);pdata++; } printf(&The data num:%d&,datacount); datacount++; } void main() { /*........模块测试命令..............WBR....................*/ uchar CDMA_COMMAND_1[]={&at\r&}; uchar CDMA_COMMAND_2[]={&atz\r&}; uchar CDMA_COMMAND_3[]={&ate1v1\r&}; uchar CDMA_COMMAND_4[]={&AT+CRM=1;+WBRCPS=33;+CMUX=1;+CTA=0\r&}; uchar CDMA_COMMAND_5[]={&AT+WBRVPPPOPEN\r&}; uchar CDMA_COMMAND_6[]={&AT+WBRVTCPOPEN=1,\&60.63.42.129\&,WBR1234\r&}; uchar CDMA_COMMAND_7[]={&AT+WBRVTCPSEND=1,20\r&}; uchar CDMA_DATA[]={&WBRABCDEFGHIJKLMNOPQRST&}; uchar CDMA_COMMAND_9[]={&AT+WBRVPPPCLOSE\r&}; uchar CDMA_COMMAND_8[]={&AT+WBRVTCPCLOSE=1\r&}; uchar bExit_flag1 = 0x00; time_t start, double dif=0; InitCom();/*初始化端口1*/ inputData = inportb(Com1_base+RXR); while(!bExit_flag1) { /*............................WBR..............................WBR.......*/ if(kbhit()) /*按任意键开始测试CDMA*/ { /*............................WBR..............................WBR.... ...*/ /*.........发送TCP断开命令..........WBR...........................*/ CDMA_CommandSend(CDMA_COMMAND_WBR8,strlen(CDMA_COMMAND_8)); /*.........发送PPP断开命令..........WBR............................*/ CDMA_CommandSend(CDMA_COMMAND_WBR9,strlen(CDMA_COMMAND_9)); /*.........发送AT命令.............WBR.............................*WBR/ CDMA_CommandSend(CDMA_COMMAND_WBR1,strlen(CDMA_COMMAND_1)); /*.........发送ATZ命令............WBR.............................*WBR/ CDMA_CommandSend(CDMA_COMMAND_WBR2,strlen(CDMA_COMMAND_2)); /*.........发送ATE1V1命令.........WBR.............................*WBR/ CDMA_CommandSend(CDMA_COMMAND_WBR3,strlen(CDMA_COMMAND_3)); /*.........发送AT初始化命令..........WBR..........................*/ CDMA_CommandSend(CDMA_COMMAND_WBR4,strlen(CDMA_COMMAND_4)); /*.........发送PPP拔号命令..........WBR...........................*/ CDMA_CommandSend(CDMA_COMMAND_WBR5,strlen(CDMA_COMMAND_5)); /*.........发送网络连接命令...........WBR.........................*/ CDMA_CommandSend(CDMA_COMMAND_WBR6,strlen(CDMA_COMMAND_6)); /*.........发送数据...............WBR.............................*WBR/ datacount=0; while(1) { Data_Send(CDMA_COMMAND_7,WBRstrlen(CDMA_COMMAND_7),CDMA_WBRDATA,strlen(CDMA_DATA)); time (&start); dif=0; while(dif&0.2) { delay(9000); time (&end); dif = difftime (end,start); } if(kbhit()){a=getch(); if(a==' '){bExit_flag1 = 0x01;}} } /*.........发送TCP断开命令..........WBR...........................*/ for(i=0;i&3;i++) CDMA_CommandSend(CDMA_COMMAND_WBR8,strlen(CDMA_COMMAND_8)); /*.........发送PPP断开命令..........WBR............................*/ for(i=0;i&3;i++) CDMA_CommandSend(CDMA_COMMAND_WBR9,strlen(CDMA_COMMAND_9)); bExit_flag1 = 0x01; } /*............................WBR..............................WBR.......*/ } CloseCom(); /*关闭端口1*/ printf(&Bye~.\n&); }
请登录后再发表评论!曲线拟合(转载)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
35页免费29页免费53页免费55页免费26页免费23页免费8页免费4页免费5页免费7页3下载券
喜欢此文档的还喜欢10页5下载券4页5下载券3页5下载券3页5下载券3页5下载券
曲线拟合(转载)|曲​线​拟​合​(​转​载​)
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:4.65KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢Tag: gcd | 永夜初晗凝碧天
A: Good Rectangle(zoj3571)
等待更新……
B:Getting Meal(zoj3572)
等待更新……
C:Under Attack(zoj3573)
C题可以说是本次比赛最简单的一题,题目大意是,每一个炸弹可以毁坏公路的一定区域,问投了多个炸弹后,从南到北和从北到南的公路上第一个毁坏最严重的是在哪一点。例如,对于测试数据,在一个长10的公路,第一个炸弹,毁坏了公路的长从1到5的区域,毁坏程度是2,同理,第二个炸弹,毁坏了公路的长从6到9的区域,毁坏程度是2.所以,南到北和从北到南的公路上第一个毁坏最严重的点分别是1和9没什么好说的,开一个适当大小的数组,我们可以对每一个炸弹的起点和终点分别加上毁坏程度和减少毁坏程度,这样,当炸弹全部投放完毕后,然后遍历这个数组,并用sumk求前面k的数组的和,则sumk就是第k个点的最后毁坏程度,详情看代码
题目实际上就是求$$\sum_{i=0}^{n-1}\left | i \mod a-i \mod b \right |$$
既然有取余,明显会有循环节,很显然循环节是lcm(a,b)
那就求出循环节部分的值再乘以循环的次数再加上其余部分就可以了
多校的时候a,b都取的int,WA了
后来才弄对
[code lang=”cpp”]
include &algorithm&
include &iostream&
include &string&
include &cstring&
include &cstdio&
include &cmath&
define zero(a) memset(a,0,sizeof(a))
define one(a) memset(a,1,sizeof(a))
define fone(a) memset(a,-1,sizeof(a))
define pow2(a) ((a)*(a))
define pow3(a) ((pow2(a))*(a))
int64 gcd(int64 a,int64 b){
return b==0?a:gcd(b,a%b);}
int64 lcm(int64 a,int64 b){
return a/gcd(a,b)*b;}
int64 abs(int64 k){
return k&0?-k:k;}int main(){
scanf(&%d&,&T);
while(T—)
__int64 n,a,b;
scanf(&%I64d%I64d%I64d&,&n,&a,&b);
if(a>b)
__int64 k=gcd(a,b);
__int64 ga=a/k;
__int64 gb=b/k;
__int64 i,j;
__int64 sum=0;
__int64 sumn=0;
__int64 x=0;
__int64 nm=(n%lcm(a,b))/b;
__int64 tx=0;
for(i=0;i<i++)
__int64 anum=x/a;
__int64 x1=(anum+1)*a-x;
sumi+=x1*abs(x%a-x%b);
__int64 sy=b-x1;
while(sy>=a)
sumi+=a*abs(x%a-x%b);
sumi+=sy*abs(x%a-x%b);
for(i=0;i<i++)
__int64 anum=x/a;
__int64 x1=(anum+1)*a-x;
sumi+=x1*abs(x%a-x%b);
__int64 sy=b-x1;
while(sy>=a)
sumi+=a*abs(x%a-x%b);
sumi+=sy*abs(x%a-x%b);
__int64 ans=sum*(n/lcm(a,b))+
__int64 nab=n%lcm(a,b);
for(i=nm*b;i<i++)
ans+=abs(i%a-i%b);
printf(&%I64d\n&,ans);
题目大意就是给出a和r,求c,其中c mod ai = ri;这题就是扩展欧几里得的一个简单应用
首先我们可以假设c=a0x+r0=a1y+r1;则a0x-a1y=r1-r0;此时可以求出x,故可以求出c。
假设A=lcm(a0,a1),则A=a0t1=a1t1;那么可以推出C’=Az+C=a0tz+a0x+r0=a0(t0z+x)+r0=a1(t1z+y)+r1;故这时再将这两个式子合并写成C’=lcm(a0,a1)*z+C;再与接下来的ai和ri合并即可
[code lang=”cpp”]
include &algorithm&
include &iostream&
include &string&
include &cstring&
include &cstdio&
include &cmath&
define zero(a) memset(a,0,sizeof(a))
define one(a) memset(a,1,sizeof(a))
define fone(a) memset(a,-1,sizeof(a))
define pow2(a) ((a)*(a))
define pow3(a) ((pow2(a))*(a))
void e_gcd ( int64 a , int64 b , int64 &d , int64 &x , __int64 &y ){
if ( ! b )
d = a , x =1 , y =0 ;
e_gcd ( b , a%b , d , y , x ) , y -= x * ( a / b ) ;
}int64 gcd(int64 a,int64 b){
return b==0?a:gcd(b,a%b);}
int64 lcm(int64 a,int64 b){
return a/gcd(a,b)b;}int main(){
while(~scanf(&%d&,&T))
int64 m,n,r1,r2;
scanf(&%I64d%I64d&,&m,&r1);
for(i=0;i&T;i++)
scanf(&%I64d%I64d&,&n,&r2);
int64 x,y,d;
e_gcd(m,n,d,x,y);
if((r2-r1)%d!=0)
__int64 t=(r2-r1)/d;
x%=(n/d);//求出最小正整数x
while(x&0)
r1=mx+r1;//合并
m=lcm(m,n);
if((r1-r2)%n!=0)
printf(&%I64d\n&,r1);
printf(&-1\n&);
题目大意就是给出一个奇素数,求出他的原根的个数,定义n的原根x满足条件0&x&n,并且有集合{ (xi mod n) | 1 &= i &=n-1 } 和集合{ 1, …, n-1 }相等
关于这道题。如果知道欧拉函数的话,看出的答案是phi(n-1)其实也不难
定理:如果p有原根,则它恰有φ(φ(p))个不同的原根,p为素数,当然φ(p)=p-1,因此就有φ(p-1)个原根
关于证明我也不会,这些都是在Discuss里搜索到的,证明过程也算来自那吧!
对于给出的素数p,首先要明确一点:p的元根必然是存在的(这一点已由Euler证明,此处不再赘述),因此,不妨设其中的一个元根是a0(1&=a0&=p-1)按照题目的定义,a0^i(1&=i&=p-1) mod p的值是各不相同的,再由p是素数,联系Fermat小定理可知:q^(p-1) mod p=1;(1&=q&=p-1)(这个在下面有用)
下面证明,如果b是p的一个异于a的元根,不妨令b与a0^t关于p同余,那么必然有gcd(t,p-1)=1,亦即t与p-1互质;反之亦然;
若d=gcd(t,p-1)&1,令t=k1d,p-1=k2d,则由Fermat可知(a0^(k1d))^k2 mod p=(a0^(k2d))^(k1) mod p=(a0^(p-1))^(k1) mod p=1
再由b=a0^t (mod p),结合上面的式子可知:(a0^(k1*d))^k2 mod n=b^k2 mod p=1;
然而b^0 mod p=1,所以b^0=b^k2 (mod p),所以b^i mod p的循环节=k2&p-1,因此这样的b不是元根;
若d=gcd(t,p-1)=1,即t与p-1互质,那么b必然是元根;
否则假设存在1&=j<i(p-1) | t*(i-j),由于p与t互质,所以(p-1) | (i-j),但是根据假设,0&i-j&p-1,得出矛盾,结论得证;</i
由上面的两个证明可知b=a0^t (mod p),是一个元根的充要条件是t与p-1互质,所有的这些t的总个数就是Phi(p-1);具体参见
然后直接套用那个求欧拉函数的模板1A了,我发现我最近好喜欢套模板啊,没办法,知道的太少了
[code lang=”cpp”]
include&iostream&
include&cstdlib&
include&cstdio&
include&cstring&
include&algorithm&
include&cmath&
int phi[66000]; int main() {
for ( i = 2 ; i &=
65536 ; i ++ )
for ( i = 2 ; i &=
65536 ; i ++ )
if ( !phi[i] )
for ( j = j &=
65536 ; j += i )
if ( !phi[j] )
phi[j] = phi[j] / i * (i - 1 ) ;
while ( cin &gt;&gt; n )
cout&lt;&lt;phi[n-1]&lt;&lt;
A: Good Rectangle(zoj3571)&&&&&&&&等待更新……
B:Getting Meal(zoj3572)&&&&&&&&等待更新……
C:Under Attack(zoj3573)&&&&&&&&C题可以说是本次比赛最简单的一题,题目大意是,每一个炸弹可以毁坏公路的一定区域,问投了多个炸弹后,从南到北和从北到南的公路上第一个毁坏最严重的是在哪一点。&&&&&&&&例如,对于测试数据,在一个长10的公路,第一个炸弹,毁坏了公路的长从1到5的区域,毁坏程度是2,同理,第二个炸弹,毁坏了公路的长从6到9的区域,毁坏程度是2.所以,南到北和从北到南的公路上第一个毁坏最严重的点分别是1和9&&&&&&&&没什么好说的,开一个适当大小的数组,我们可以对每一个炸弹的起点和终点分别加上毁坏程度和减少毁坏程度,这样,当炸弹全部投放完毕后,然后遍历这个数组,并用sumk求前面k的数组的和,则sumk就是第k个点的最后毁坏程度,详情看代码
#include "iostream"
#include "cstdio"
#include "cstdlib"
#define zero(x)
(memset(x,0,sizeof(x)))
int sum[15005];
int main()
int n,i,j,k,s,t,ans,maxx,
while(~scanf("%d",&n))
zero(sum);
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c),a!=-1&&b!=-1&&c!=-1)
sum[a]+=c;
sum[b+1]-=c;//注意是第b+1减,因为第b个点也受到炸弹的影响,详见题目原文
int ans=0;
int maxx=-
for(i=0;i<=n;i++) {="" ans+="sum[i];" sum[i]="" if(maxx<ans)="" maxx="" s="t=i;" }="" else="" if(maxx="=ans)" t="i;" printf("%d="" %dn",s,t);="" return="" 0;="" }
D: Under Attack II(zoj3574)&&&&&&&&
E: Under Attack III(zoj3575)&&&&&&&&等待更新……
F: Count the Length(zoj3576)&&&&&&&&F题是一个找规律题目,可以多列几组数据进行查看。题目意思很简单,nm个边长为1的正方形,排成nm的矩形,其中左下角的是红色,然后红蓝交替摆放正方形,然后一条对角线横穿矩形的左下角和右上角,最后就对角线红色部分的总长度。&&&&&&&&由于只想到找规律,所以只有多找几组数据进行测试。注意,对于数据4 6和2 3其实是一样的,所以可以将a,b约分后再探索。很容易发现当a=b时,红色占全部。当a和b中有且仅有一个是偶数时,则红色部分一直占用1/2。而当是1、3时红色部分是2/3,3、5时是8/15,5、7时是18/35,3、7时是11/21;这时很容易想到分母就是ab,然后就是分子的规律,多亏*提醒,向上取整,果然符合所有的数据,至于是为什么,本人不才,暂时还没有想到证明办法,如果有哪位ACMer愿意提供,那就在此多谢了。具体详见代码
#include "iostream"
#include "cmath"
#include "cstdio"
unsigned int gcd(unsigned int a,unsigned int b)
return b==0?a:gcd(b,a%b);
int main()
unsigned long long a,b;
while(cin>>a>>b)
k=gcd(a,b);
b=b/k;//注意一定要约去a,b的公因子
printf("%.3lfn",(ceil((a*b)/2.0)/(a*b*1.0))*1.0*sqrt(1.0*(a*a+b*b))*k);
//向上取整可用ceil(),向下取整可用floor()
G: Max Damage Export(zoj3577)&&&&&&&&等待更新……
H: Matrix(zoj3578)&&&&&&&&H题刚开始以为是二维的线段树或者是树状数组,但悲剧的是我连一维的都不会,更何况做二维,直接放弃。请教laputa大神,大神直接说和C题有点像Orz,讨论了一下,感觉就是C题的二维,然后,大神立刻去码代码,到码得差不多大神突然说题目看错了,Orz!到最后没兴趣了,直接不做了。&&&&&&&&题目大意差不多就是定义了一个nm的0矩阵,然后定义了一组操作(a,b,h,x,y),意思就是先求出子矩阵[(x,y)~(x+a,y+b)]的最大值max,然后对该子矩阵的每一个元素赋值为max+h,问,对于nmd的矩阵C步操作后,其中的元素最大值是多少&&&&&&&&这题其实我也不会做,但看了一个日本人写的代码,再加上谷歌那渣的翻译,我竟然看懂了,Orz!原文地址:&&&&&&&&方法很简单,就是每一次判断两个矩阵是否相交,如果不相交就什么事都没有,如果相交的话,就比较两个矩阵的最大值,取最大的一个并加上h。最后遍历每个矩阵,求出max,也可以边比较变遍历,详细看代码。刚开始看的时候一直不明白相交后的操作,为什么只更新后一个矩阵而前一个相交的部分为什么不更新。想了半天,终于明白了。因为更新最后一个矩阵的值也同时把前一个矩阵相交部分也给更新了,只不过虽然在前一个矩阵中还是原来那个数,但最后还是要比较到大的那个矩阵,对结果没影响。
#include "iostream"
#include "cmath"
#include "cstdio"
#define zero(x)
(memset(x,0,sizeof(x)))
#define to(i,x,n)
for(i=x;ib?a:b;
bool iandjcross(int i,int j)
{//判断矩阵i和j是否相交
if(matrix[i].xa>=matrix[j].xb||matrix[i].xb=matrix[j].yb||matrix[i].yb<=matrix[j].ya) return=""=""="" }="" int="" main()="" {="" n,m;="" i,j,k;="" x,y,z;="" r,s,t;="" ans,maxx,="" while(~scanf("%d%d%d",&n,&m,&k))="" maxx="0;" to(i,0,k)="" scanf("%d%d%d%d%d",&r,&s,&t,&x,&y);="" ans="0;" matrix[i].xa="x;" matrix[i].ya="y;" matrix[i].xb="x+r;" matrix[i].yb="y+s;" to(j,0,i)="" if(iandjcross(i,j))="" matrix[i].h="(ans+t);" printf("%dn",maxx);="" 0;=""
I: Gao the variable(zoj3579)&&&&&&&&等待更新……
J: Angry Birds(zoj3580)&&&&&&&&等待更新……
题目下载:
实时Rank:
代码下载:
Problem A: 不服气的数字
假设可以去的2数有k个
如果要求取得没有0,则答案为k^1+k^2+k^3+……+k^n
如果要求取得数含有0
则答案为k+(k-1)k+(k-1)k^2+(k-1)k^3+…(k-1)k^(n-1)=k^n(也可以看成k进制,直接得出答案)
Problem B: 运动会
老师选人有三种情况
N/2       (M-K)&N/2
M      
(N-K)&2*M
可组队数 (M+N-K)/3  
则最多可参加的组数是}

我要回帖

更多关于 设y y1 y2 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信