您好,欢迎访问三七文档
1Problem1三角形的个数方法1:#includestdio.hintisTriangle(inta,intb,intc)//任意2边之和大于第3边{if(a+bc&&a+cb&&b+ca)return1;elsereturn0;}voidsolve(intn){inta,b,c;intsum=0;for(a=1;an;a++){for(b=a+1;bn;b++)//b的初始值为a+1,保证了b与a不会相同{for(c=b+1;cn;c++)//c的初始值为b+1,保证了c与b、a不会相同{if(a+b+c==n&&isTriangle(a,b,c)){sum++;}}}}printf(%d\n,sum);}intmain(){intn;while(scanf(%d,&n)==1){solve(n);}return0;}方法2:#includestdio.hintisTriangle(inta,intb,intc)//任意2边之和大于第3边{if(a+bc&&a+cb&&b+ca)return1;2elsereturn0;}voidsolve(intn){inta,b,c;intsum=0;for(a=1;an;a++){for(b=a+1;bn;b++)//b的初始值为a+1,保证了b与a不会相同{c=n-a-b;//保证a+b+c=nif(cb)//保证了c与b、a不会相同{if(isTriangle(a,b,c))sum++;}elsebreak;}}printf(%d\n,sum);}intmain(){intn;while(scanf(%d,&n)==1){solve(n);}return0;}Problem2纯粹素数#includestdio.h#includestring.h#includestdlib.h#defineMINM1013//1013是第一个大于1000的纯粹素数#defineMAXN20//n的最大取值#defineMAXD10chardigit[MAXD+1];intpureprime[MAXN+1];intisPrime(inti)//判断参数i是否是素数3{intj,m=sqrt(i*1.0);if(i2)return0;for(j=2;j=m;j++){if(i%j==0)return0;}return1;}intisPurePrime(intm)//判断参数m是否是纯素数{inti,len;sprintf(digit,%d,m);//整数m转换成字符串保存在digit中len=strlen(digit);for(i=0;ilen;i++){if((digit[i]!='0')&&(isPrime(atoi(digit+i))==0))//atoi()将数字字符串转换成整数{return0;}}return1;}voidinitialize(){inti;intn=0;for(i=MINM;nMAXN;i+=2)//只需处理奇数{if(isPurePrime(i)){pureprime[++n]=i;}}}intmain(){intn;initialize();while(scanf(%d,&n)!=EOF){printf(%d\n,pureprime[n]);4}return0;}Problem3纯粹合数#includestdio.h#includestring.h#includestdlib.h#defineMINM100#defineMAXN100//最多需要计算100个合数#defineMAXD10chardigit[MAXD+1];intpureComposite[MAXN+1];intcount;intisComposite(intm)//判断参数m是否是合数{inti;for(i=2;i*i=m;i++){if(m%i==0){return1;}}return0;}intisPureComposite(intm)//判断参数m是否是纯合数{inti,len,num;sprintf(digit,%d,m);//整数m转换成字符串保存在digit中len=strlen(digit);for(i=0;ilen;i++){num=atoi(digit+i);//atoi()将数字字符串转换成整数if(num&&isComposite(num)==0){return0;}}return1;}voidinitialize(){5inti;count=0;for(i=MINM;countMAXN;i++){if(isPureComposite(i)){pureComposite[++count]=i;}}}intmain(){intn;initialize();while(scanf(%d,&n)!=EOF){printf(%d\n,pureComposite[n]);}return0;}Problem4求数列项//p[1]=1,p[i]=p[i-1]+(i-1)*3+1#includestdio.hintmain(){inti,n;intindex=1,delta=4;intp[51];p[1]=index;for(i=2;i=50;i++){index+=delta;delta+=3;p[i]=index;}while(scanf(%d,&n)==1){printf(%d\n,p[n]);}return0;}Problem5最高频率#includestdio.hintmain()6{intn,num,i;inthash[110];//hash[i]代表数i出现的次数,i的范围[1,109]。intmax;//存放最多次数intvalue;//出现最多次数的那个数while(scanf(%d,&n)==1){for(i=0;i110;i++)hash[i]=0;max=0;value=1;for(i=0;in;i++){scanf(%d,&num);hash[num]++;//num出现的次数加1if(hash[num]==max&&numvalue)//当前数出现次数与max相同,并且当前数更小{value=num;}elseif(hash[num]max)//当前数出现次数max{max=hash[num];value=num;}}printf(%d\n,value);}return0;}Problem6按要求输出序列/*方法1:读所有数据;排序;删除重复数据。方法2:考虑到数据的值都在[0,109]范围,所以定义数组hash[110],元素值为0或1。hash[num]的值为0时表示数num未出现过;1表示数num已出现过。循环读入一个num,设置hash[num];最后输出时,当hash[num]值为1时,输出num。下面是对应方法2的代码。*/#includestdio.h#includestring.h#defineMAX110intmain(){intn;//存放数的个数intnum;//存放读入的某个数7charhash[MAX];//hash[num]的值为0时表示数num未出现过;1表示数num已出现过intfirst,i;while(scanf(%d,&n)==1){memset(hash,0,sizeof(hash));for(i=0;in;i++){scanf(%d,&num);hash[num]=1;}first=1;//表示是否是第一个数for(i=0;iMAX;i++){if(hash[i]==1){if(!first){printf();}printf(%d,i);first=0;}}printf(\n);}return0;}Problem7特殊四位数#includestdio.h#includemath.hvoidtoArray(intn,int*p)//将参数n的各位数字分离到p指向的数组中{intcnt=0;while(n){p[cnt++]=n%10;//分离最低位数字n/=10;//缩小10倍}}intyes(intn)//判断n的千位数字与十位数字之和是否等于百位数字与个位数字之积{intarray[5];//array[0]存放个位,...,array[3]存放千位toArray(n,array);if(array[3]+array[1]==array[2]*array[0])8return1;elsereturn0;}intsqrtTest(intn)//判断n是否是某一个自然数的平方{intt=(int)sqrt((double)n);if(t*t==n)return1;elsereturn0;}intmain(){intn,i;inta[3];//符合条件的数只有3个i=0;for(n=1000;n10000;n++)if(yes(n)&&sqrtTest(n)){a[i++]=n;}while(scanf(%d,&n)==1){printf(%d\n,a[n-1]);}return0;}Problem8找到最大数#includestdio.hvoidswap(int*a,int*b){inttemp=*a;*a=*b;*b=temp;}intmain(){intn,array[1201];//数的个数不超过1200个inti;intmax,pos;while(scanf(%d,&n)==1&&n){scanf(%d,array);//读入第1个数据9max=array[0];pos=0;for(i=1;in;i++){scanf(%d,array+i);//读入数据到array[i]if(array[i]max){max=array[i];pos=i;}}swap(array,array+pos);//第1个数和最大数交换for(i=0;in-1;i++)printf(%d,array[i]);printf(%d\n,array[i]);}return0;}Problem9螺旋方阵版本1:递归#includestdio.h#defineN10intp[N][N];/*对size*size的方阵按顺时针方向填数,填写最外层,从第begin行第begin列开始填写,开始数为number*/voidFill(intnumber,intbegin,intsize){if(size==0)//size为偶数时的结束条件return;if(size==1)//size为奇数时的结束条件{p[begin][begin]=number;return;}inti=0;inth=begin,v=begin;p[h][v]=number;number++;for(i=0;isize-1;i++)//往右{v++;p[h][v]=number;number++;10}for(i=0;isize-1;i++)//往下{h++;p[h][v]=number;number++;}for(i=0;isize-1;i++)//往左{v--;p[h][v]=number;number++;}for(i=0;isize-2;i++)//往上{h--;p[h][v]=number;number++;}Fill(number,h,size-2);//递归填写中心区域,从第h行第h列开始填写,开始数为number}intmain(void){intn;intr=0;while(scanf(%d,&n)==1){if(r!=0)printf(\n);Fill(1,0,n);//填写n*n阶螺旋方阵的最外层,从第0行第0列开始填写,开始数为1inth,v;for(h=0;hn;h++){for(v=0;vn-1;v++)printf(%d,p[h][v]);printf(%d\n,p[h][n-1]);}r++;}retu
本文标题:C语言middle
链接地址:https://www.777doc.com/doc-7027340 .html