1. 三角形的邊
源代碼:
#include <stdio.h>void fun(int a,int b,int c){ int min,mid,max; int t; if(a>b) t=a,a=b,b=t; if(b>c) t=b,b=c,c=t; if(a>b) t=a,a=b,b=t; min=a,mid=b,max=c; PRintf("%d/n",min+mid-max);}int main(){ int a,b,c; while(scanf("%d %d %d",&a,&b,&c)!=EOF) { if(a==0) break; fun(a,b,c); } return 0;}程序截圖:
2. 平方因子
源代碼:
#include <stdio.h>int main(){ int i,n; int flag; while(scanf("%d",&n)!=EOF) { flag=0; if(n==0) break; for(i=2;i<n;i++) { if(n%i==0 && (i*i)%n==0) { flag=1; break; } } if(flag==1) printf("Yes/n"); else printf("No/n"); } return 0;}程序截圖:
3. 排列與二進(jìn)制
分析:正常的順序應(yīng)該先求出排列數(shù),再將其轉(zhuǎn)化成二進(jìn)制數(shù),之后進(jìn)行末尾連續(xù)0的判斷,但是要注意其中有幾個(gè)難點(diǎn): ①求排列數(shù)的結(jié)果是否越界,越界之后用數(shù)組是否方便? ②轉(zhuǎn)換成二進(jìn)制也需要存入數(shù)組中。 但是根據(jù)十進(jìn)制轉(zhuǎn)換成二進(jìn)制的商除法就會(huì)發(fā)現(xiàn),不斷除以2,先出現(xiàn)的就是最后二進(jìn)制從后往前的數(shù)(即除2取余)。故要求二進(jìn)制末尾的連續(xù)0的個(gè)數(shù),只要看n(n-1)(n-2)……(n-m+1)最多可以整除幾個(gè)2即可(利用此方法可以避免可能的數(shù)組越界和int型超精度問題)
源代碼:
#include <stdio.h>int main(){ int n,m; int i,t,num; //num記錄排列數(shù)后面0的個(gè)數(shù) while(scanf("%d %d",&n,&m)!=EOF) { num=0; if(n==0) break; for(i=n-m+1;i<=n;i++) // n*(n-1)*(n-2)*...*(n-m+1) { t=i; while(t%2==0) //除2取余得0時(shí),即為排列數(shù)后面的0 { num++; t/=2; //除2 } } printf("%d/n",num); } return 0;}程序截圖:
4. 怪異的洗牌
源代碼:
#include <stdio.h>#define maxn 1000void Shift(int poker[],int result[],int x,int n) //移位(數(shù)組循環(huán)移位問題) { int i,j=0; for(i=x;i<n;i++) //將數(shù)組第x+1個(gè)元素到最后一個(gè)元素移到最前面 result[j++]=poker[i]; for(i=0;i<x;i++) //其余元素置后 result[j++]=poker[i];}void Flip(int result[],int half) //翻轉(zhuǎn)(數(shù)組逆置/逆序輸出問題) { int i=0,j=half-1; //以下用逆序存儲完成 int temp; while(i<j) { temp=result[i]; result[i]=result[j]; result[j]=temp; i++,j--; }}int main(){ int i,n,k,x; int t,half; //t-移位/翻轉(zhuǎn)操作次數(shù) half-翻轉(zhuǎn)操作標(biāo)記 int poker[maxn],result[maxn]={0}; //兩數(shù)組分別記錄操作前和操作后的牌 while(scanf("%d %d",&n,&k)!=EOF) { if(n==0) break; t=0; for(i=0;i<n;i++) //操作前撲克牌賦值 poker[i]=i+1; while(t<k) { scanf("%d",&x); Shift(poker,result,x,n); //移位操作 結(jié)果存入result數(shù)組 if(n%2==0) //確定翻轉(zhuǎn)操作位置 half=n/2; else half=(n-1)/2; Flip(result,half); //在上述result數(shù)組結(jié)果基礎(chǔ)上翻轉(zhuǎn) t++; for(i=0;i<n;i++) //將一輪操作結(jié)束后的結(jié)果賦給poker數(shù)組(之前因?yàn)楹雎源瞬讲僮鱓A了,k>1時(shí)將會(huì)派上大用場:( ) poker[i]=result[i]; } for(i=0;i<n;i++) //k次操作結(jié)束后的結(jié)果 printf("%d ",result[i]); printf("/n"); } return 0;}程序截圖:
新聞熱點(diǎn)
疑難解答
圖片精選