文章目錄
前言
聲明:我個人反感直接刷什麼各個公司的筆試題,我比較傾向於掌握基礎的算法思想,不變應萬變,所以會從基礎的內容開始介紹,像高考一樣,課本的基礎內容掌握了才能真正應對高考,只刷真題我個人認爲效率低下
先給大家說一下學習的規劃,之前大家有了數據庫的學習和項目的經驗,接下來就是所有互聯網公司都有的一個基礎環節--------筆試。各個公司有各個公司的筆試考點規劃,大廠比較單一,就考驗個人的算法能力,當然,難度係數也是比較大的,中型及以下的公司筆試考試較爲全面,主要考察個人的大學學習情況,可能會有指針啊泛型啊之類的基礎內容的考察,相對而言比較簡單,金融行業的公司可能還會涉及文件操作的內容,但是,都離不開的是算法的考察。
因爲特殊原因,身邊有些小盆友很久沒有敲代碼而且沒有發動小腦斧學語言了,所以計劃有些更改,這一篇是爲某些小白的盆友準備的,帶你回到C語言的世界
之後,楊某人呢將會分爲四部分,算法初階能力的掌握(100道試題鞏固最最最基礎的代碼能力),算法大廠核心考察的能力提升(從算法思想展開到真正的算法試題難度),其他考點的綜合介紹,和c++面經(像牛客啊,其他的博主也有介紹,我呢主要負責資源的整合和透露大廠的我還能記住的面試題,大家有自己的資源就看自己的資源即可),這四部分爲大家展開。本篇就是算法的基礎能力,爲大家分享的是我剛開始的訓練試題,比較簡單,大概一天的時間就足夠了,不用敲,主要回顧一下自己的代碼思維就行,很簡單的,下一篇博客會直接按照算法思想的分類進行訓練,這一片大家一定要快速通過(主要給某些代碼能力很差勁的同學準備的,大部分人略看一下,一天時間看過就行)
第一部分
韓信點兵
相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7),輸出總人數的最小值(或報告無解)。已知總人數不小於10,不超過100 。
輸入
輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7)。例如,輸入:2 4 5
輸出
輸出總人數的最小值(或報告無解,即輸出No answer)。實例,輸出:89
#include <stdio.h>
int main(){
int a;
int b;
int c;
int i;
scanf("%d%d%d",&a,&b,&c);
for(i=10;i<=100;i++){
if(i%3==a && i%5==b && i%7==c){
printf("%d\n",i);
break;
}
}
if(i==101)
printf("No answer\n");
return 0;
}
蘭州燒餅
燒餅有兩面,要做好一個蘭州燒餅,要兩面都弄熱。當然,一次只能弄一個的話,效率就太低了。有這麼一個大平底鍋,一次可以同時放入k個蘭州燒餅,一分鐘能做好一面。而現在有n個蘭州燒餅,至少需要多少分鐘才能全部做好呢?
輸入
依次輸入n和k,中間以空格分隔,其中1 <= k,n <= 100000
輸出
輸出全部做好至少需要的分鐘數
提示
如樣例,三個蘭州燒餅編號a,b,c,首先a和b,然後a和c,最後b和c,3分鐘完成
#include <stdio.h>
int main(){
int n;
int k;
int total;
int result;
while(scanf("%d%d",&n,&k)!=EOF){
total=n*2;
if(total<k){ //沒有考慮到total<k的情況
printf("2\n");
continue;
}
result=total/k;
if(total%k!=0)
result++;
printf("%d\n",result);
}
return 0;
}
進制轉換
輸入一個十進制數N,將它轉換成R進制數輸出。
輸入
輸入數據包含多個測試實例,每個測試實例包含兩個整數N(32位整數)和R(2<=R<=16, R<>10)。
輸出
爲每個測試實例輸出轉換後的數,每個輸出佔一行。如果R大於10,則對應的數字規則參考16進制(比如,10用A表示,等等)。
#include <stdio.h>
int main(){
int number;
int system;
char s[50];
int i;
int length;
int flag;
while((scanf("%d%d",&number,&system))!=EOF){
i=0;
flag=0;
if(number<0){
number=-number;
flag=1;
}
while(number){
if(number%system<=9){
s[i]=(number%system)+'0';
}
else if(number%system==10)
s[i]='A';
else if(number%system==11)
s[i]='B';
else if(number%system==12)
s[i]='C';
else if(number%system==13)
s[i]='D';
else if(number%system==14)
s[i]='E';
else if(number%system==15)
s[i]='F';
number/=system;
i++;
}
length=i;
if(flag==1)
printf("-");
for(i=length-1;i>=0;i--)
printf("%c",s[i]);
printf("\n");
}
return 0;
}
第幾天?
給定一個日期,輸出這個日期是該年的第幾天。
輸入
輸入數據有多組,每組佔一行,數據格式爲YYYY/MM/DD組成,具體參見sample input ,另外,可以向你確保所有的輸入數據是合法的。
輸出
對於每組輸入數據,輸出一行,表示該日期是該年的第幾天。
#include <stdio.h>
int main(){
int a;
int b;
int c;
int i;
int day[13];
int sum;
day[1]=31;
day[2]=28;
day[3]=31;
day[4]=30;
day[5]=31;
day[6]=30;
day[7]=31;
day[8]=31;
day[9]=30;
day[10]=31;
day[11]=30;
day[12]=31;
while((scanf("%d/%d/%d",&a,&b,&c))!=EOF){
sum=0;
for(i=1;i<=b-1;i++)
sum+=day[i];
sum+=c;
if((a%400==0 || (a%4==0 && a%100!=0)) && b>=3)
sum++;
printf("%d\n",sum);
}
return 0;
}
成績轉換
輸入一個百分制的成績M,將其轉換成對應的等級,具體轉換規則如下:
90~100爲A;
80~89爲B;
70~79爲C;
60~69爲D;
0~59爲E;
#include <stdio.h>
int main(){
int T;
int n;
char c;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
if(n>=90)
c='A';
else if(n>=80)
c='B';
else if(n>=70)
c='C';
else if(n>=60)
c='D';
else
c='E';
printf("%c\n",c);
}
return 0;
}
第二部分
求實數的絕對值。
輸入
輸入數據有多組,每組佔一行,每行包含一個實數。
輸出
對於每組輸入數據,輸出它的絕對值,要求每組數據輸出一行,結果保留兩位小數。
#include <stdio.h>
int main(){
double number;
while((scanf("%lf",&number)!=EOF)){
if(number<0)
number=-number;
printf("%.2lf\n",number);
}
return 0;
}
計算球體積
根據輸入的半徑值,計算球的體積。
輸入
輸入數據有多組,每組佔一行,每行包括一個實數,表示球的半徑。
輸出
輸出對應的球的體積,對於每組輸入數據,輸出一行,計算結果保留三位小數。
#include <stdio.h>
#define PI 3.1415927
int main(){
double r;
double result;
while((scanf("%lf",&r))!=EOF){
result=4.0*PI*r*r*r/3.0;
printf("%.3lf\n",result);
}
return 0;
}
兩點距離
輸入兩點座標(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),計算並輸出兩點間的距離。
輸入
第一行輸入一個整數n(0<n<=1000),表示有n組測試數據;隨後每組佔一行,由4個實數組成,分別表示x1,y1,x2,y2,數據之間用空格隔開。
輸出
對於每組輸入數據,輸出一行,結果保留兩位小數。
#include <stdio.h>
#include <math.h>
int main(){
int T;
double a;
double b;
double c;
double d;
double distance;
scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
distance=sqrt((a-c)*(a-c)+(b-d)*(b-d));
printf("%.2lf\n",distance);
}
return 0;
}
ASCII碼排序
輸入三個字符(可以重複)後,按各字符的ASCII碼從小到大的順序輸出這三個字符。
輸入
第一行輸入一個數N,表示有N組測試數據。後面的N行輸入多組數據,每組輸入數據都是佔一行,有三個字符組成,之間無空格。
輸出
對於每組輸入數據,輸出一行,字符中間用一個空格分開。
#include <stdio.h>
int main(){
char a;
char b;
char c;
char temp;
int T;
scanf("%d",&T);
getchar();
while(T--){
scanf("%c%c%c",&a,&b,&c);
getchar();
if(a>b){
temp=a;
a=b;
b=temp;
}
if(a>c){
temp=a;
a=c;
c=temp;
}
if(b>c){
temp=b;
b=c;
c=temp;
}
printf("%c %c %c\n",a,b,c);
}
return 0;
}
數值統計
統計給定的n個數中,負數、零和正數的個數。
輸入
輸入數據有多組,每組佔一行,每行的第一個數是整數n(n<100),表示需要統計的數值的個數,然後是n個實數;如果n=0,則表示輸入結束,該行不做處理。
輸出
對於每組輸入數據,輸出一行a,b和c,分別表示給定的數據中負數、零和正數的個數。
#include <stdio.h>
int main(){
int n;
int i;
int a;
int b;
int c;
double number;
while(1){
a=0;
b=0;
c=0;
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++){
scanf("%lf",&number);
if(number<0)
a++;
else if(number==0)
b++;
else
c++;
}
printf("%d %d %d\n",a,b,c);
}
return 0;
}
第三部分
最小公倍數
給定兩個正整數,計算這兩個數的最小公倍數。
輸入
輸入包含多組測試數據,每組只有一行,包括兩個不大於1000的正整數.
輸出
對於每個測試用例,給出這兩個數的最小公倍數,每個實例輸出一行。
#include <stdio.h>
int get_LCM(int a,int b);
int main(){
int a;
int b;
while((scanf("%d%d",&a,&b))!=EOF){
printf("%d\n",get_LCM(a,b));
}
return 0;
}
int get_LCM(int a,int b){
int temp;
int remainder;
int A;
int B;
A=a;
B=b;
if(a<b){
temp=a;
a=b;
b=temp;
}
while(a%b){
remainder=a%b;
a=b;
b=remainder;
}
return A*B/b;
}
公約數和公倍數
小明被一個問題給難住了,現在需要你幫幫忙。問題是:給出兩個正整數,求出它們的最大公約數和最小公倍數。
輸入
第一行輸入一個整數n(0<n<=10000),表示有n組測試數據;隨後的n行輸入兩個整數i,j(0<i,j<=32767)。
輸出
輸出每組測試數據的最大公約數和最小公倍數
#include <stdio.h>
int main(){
int a;
int b;
int temp;
int T;
int a_save;
int b_save;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
if(a<b){
temp=a;
a=b;
b=temp;
}
a_save=a;
b_save=b;
while(a%b!=0){
temp=a%b;
a=b;
b=temp;
}
printf("%d %d\n",b,a_save*b_save/b);
}
return 0;
}
5個數求最值
設計一個從5個整數中取最小數和最大數的程序
輸入
輸入只有一組測試數據,爲五個不大於1萬的正整數
輸出
輸出兩個數,第一個爲這五個數中的最小值,第二個爲這五個數中的最大值,兩個數字以空格格開。
#include <stdio.h>
int main(){
int number;
int min;
int max;
int i;
for(i=0;i<5;i++){
scanf("%d",&number);
if(i==0){
min=number;
max=number;
continue;
}
if(number<min)
min=number;
if(number>max)
max=number;
}
printf("%d %d\n",min,max);
return 0;
}
素數篩子算法
現在給你一個正整數N,要你快速的找出在2…N這些數裏面所有的素數。
輸入
給出一個正整數數N(N<=2000000)、但N爲0時結束程序。、測試數據不超過100組
輸出
將2~N範圍內所有的素數輸出。兩個數之間用空格隔開
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 2000001
int main(){
int i;
int j;
char flag[N];
memset(flag,'0',N);
flag[0]='1';
flag[1]='1';
for(i=2;i<=sqrt(N);i++){
if(flag[i]=='0'){
for(j=i*i;j<N;j+=i){
flag[j]='1';
}
}
}
int number;
while(1){
scanf("%d",&number);
if(number==0)
break;
for(i=2;i<=number;i++){
if(flag[i]=='0')
printf("%d ",i);
}
printf("\n");
}
return 0;
}
分數加減法
編寫一個C程序,實現兩個分數的加減法
輸入
輸入包含多行數據
每行數據是一個字符串,格式是"a/boc/d"。
其中a, b, c, d是一個0-9的整數。o是運算符"+“或者”-"。
數據以EOF結束
輸入數據保證合法
輸出
對於輸入數據的每一行輸出兩個分數的運算結果。 注意結果應符合書寫習慣,沒有多餘的符號、分子、分母,並且化簡至最簡分數
#include <stdio.h>
int gcd(int a,int b);
int main(){
int a;
int b;
int c;
int d;
char sign;
int fenmu;
int fenzi;
char temp;
while(scanf("%d/%d%c%d/%d",&a,&b,&sign,&c,&d)!=EOF){
fenmu=b*d/gcd(b,d);
if(sign=='+')
fenzi=a*fenmu/b+c*fenmu/d;
else
fenzi=a*fenmu/b-c*fenmu/d;
if(fenzi==0){ //分子爲0直接輸出0
printf("0\n");
continue;
}
temp='+';
if(fenzi<0){ //當爲負數時,化爲正數,標記負號
fenzi=-fenzi;
temp='-';
}
if(temp=='-') //有負號時輸出負號
printf("-");
if(fenzi%fenmu==0) //如果整除時直接輸出商
printf("%d\n",fenzi/fenmu);
else //不整除時以分數的形式輸出
printf("%d/%d\n",fenzi/gcd(fenmu,fenzi),fenmu/gcd(fenmu,fenzi));
}
return 0;
}
int gcd(int a,int b){
int temp;
if(a<b){
temp=a;
a=b;
b=temp;
}
while(a%b!=0){
temp=a%b;
a=b;
b=temp;
}
return b;
}
第四部分
第二小整數
求n個整數中倒數第二小的數。每一個整數都獨立看成一個數,比如,有三個數分別是1,1,3,那麼,第二小的數就是1。
輸入
輸入包含多組測試數據。
輸入的第一行是一個整數C,表示有C測試數據;
每組測試數據的第一行是一個整數n,表示本組測試數據有n個整數(2<=n<=10),接着一行是 n個整數 (每個數均小於100);
輸出
請爲每組測試數據輸出第二小的整數,每組輸出佔一行。
#include <stdio.h>
int main(){
int T;
int n;
int i;
int min;
int min_flag;
int number[11];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&number[i]);
if(i==0){
min=number[0];
min_flag=0;
}
if(number[i]<min){
min=number[i];
min_flag=i;
}
}
for(i=0;i<n;i++){
if(i!=min_flag){
min=number[i];
break;
}
}
for(i=0;i<n;i++){
if(i!=min_flag && number[i]<min)
min=number[i];
}
printf("%d\n",min);
}
return 0;
}
奇偶數分離
有一個整型偶數n(2<= n <=10000),你要做的是:先把1到n中的所有奇數從小到大輸出,再把所有的偶數從小到大輸出。
輸入
第一行有一個整數i(2<=i<30)表示有 i 組測試數據;每組有一個整型偶數n。
輸出
第一行輸出所有的奇數。第二行輸出所有的偶數
#include <stdio.h>
int main(){
int T;
int i;
int n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=1;i<=n;i++){
if(i%2==1){
if(i==1)
printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
for(i=1;i<=n;i++){
if(i%2==0){
if(i==2)
printf("%d",i);
else
printf(" %d",i);
}
}
printf("\n");
if(T!=0)
printf("\n");
}
return 0;
}
奇偶位互換
給定一個長度爲偶數位的0,1字符串,請編程實現串的奇偶位互換。
輸入
輸入包含多組測試數據;
輸入的第一行是一個整數C,表示有C測試數據;
接下來是C組測試數據,每組數據輸入均爲0,1字符串,保證串長爲偶數位(串長<=50)。
輸出
請爲每組測試數據輸出奇偶位互換後的結果;每組輸出佔一行。
#include <stdio.h>
#include <string.h>
int main(){
int T;
char s[51];
int length;
char temp;
int i;
scanf("%d",&T);
while(T--){
scanf("%s",s);
length=strlen(s);
for(i=0;i<length-1;i+=2){
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
printf("%s\n",s);
}
return 0;
}
統計硬幣
假設一堆由1分、2分、5分組成的n個硬幣總面值爲m分,求一共有多少種可能的組合方式(某種面值的硬幣可以數量可以爲0)。
輸入
輸入數據第一行有一個正整數T,表示有T組測試數據;接下來的T行,每行有兩個數n,m,n和m的含義同上。
輸出
對於每組測試數據,請輸出可能的組合方式數;每組輸出佔一行。
#include <stdio.h>
int main(){
int T;
int amount;
int sum;
int one_amount;
int two_amount;
int five_amount;
int a;
int b;
int c;
int result;
scanf("%d",&T);
while(T--){
result=0;
scanf("%d%d",&amount,&sum);
one_amount=sum/1;
two_amount=sum/2;
five_amount=sum/5;
for(a=0;a<=one_amount;a++){
for(b=0;b<=two_amount;b++){
for(c=0;c<=five_amount;c++){
if((a+b+c)==amount && (a*1+b*2+c*5)==sum)
result++;
}
}
}
printf("%d\n",result);
}
return 0;
}
漢字統計
統計給定文本文件中漢字的個數。
輸入
輸入文件首先包含一個整數n,表示測試實例的個數,然後是n段文本。
輸出
對於每一段文本,輸出其中的漢字的個數,每個測試實例的輸出佔一行。
#include <stdio.h>
int main(){
int T;
char c;
int amount;
scanf("%d",&T);
getchar();
while(T--){
amount=0;
while((c=getchar())!='\n'){
if(c<0 || c>127)
amount++;
}
printf("%d\n",amount/2);
}
return 0;
}
第五部分
偶數求和
有一個長度爲n(n<=100)的數列,該數列定義爲從2開始的遞增有序偶數,現在要求你按照順序每m個數求出一個平均值,如果最後不足m個,則以實際數量求平均值。編程輸出該平均值序列。
輸入
輸入數據有多組,每組佔一行,包含兩個正整數n和m,n和m的含義如上所述。
輸出
對於每組輸入數據,輸出一個平均值序列,每組輸出佔一行。
#include <stdio.h>
int main(){
int sequence[101];
int i;
int j;
int n;
int m;
int result;
int remainder;
int flag;
for(i=0;i<101;i++)
sequence[i]=(i+1)*2;
while((scanf("%d%d",&n,&m))!=EOF){
result=0;
j=1;
flag=0;
remainder=n%m;
for(i=0;i<=n;i++){
if(j<=m){
result+=sequence[i];
}
else{
if(flag==0)
printf("%d",result/m);
else
printf(" %d",result/m);
flag=1;
j=1;
result=sequence[i];
}
j++;
}
if(remainder){
printf(" %d",(result-sequence[n])/remainder);
}
printf("\n");
}
return 0;
}
楊輝三角
還記得中學時候學過的楊輝三角嗎?具體的定義這裏不再描述,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
輸入
輸入數據包含多個測試實例,每個測試實例的輸入只包含一個正整數n(1<=n<=30),表示將要輸出的楊輝三角的層數。
輸出
對應於每一個輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開,每一個楊輝三角後面加一個空行。
#include <stdio.h> //本來不會做的,但是編着編着就出來了,麼麼噠
int main(){
int n;
int triangle[31][31];
int i;
int j;
while((scanf("%d",&n))!=EOF){
for(i=0;i<31;i++)
for(j=0;j<31;j++)
triangle[i][j]=0;
triangle[0][0]=1;
triangle[1][0]=1;
triangle[1][1]=1;
for(i=2;i<n;i++){
triangle[i][0]=1;
triangle[i][i]=1;
for(j=1;j<=i;j++){
triangle[i][j]=triangle[i-1][j]+triangle[i-1][j-1];
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(triangle[i][j]!=0){
if(j==0)
printf("%d",triangle[i][j]);
else
printf(" %d",triangle[i][j]);
}
}
printf("\n");
}
printf("\n");
}
return 0;
}
統計字符
統計一個給定字符串中指定的字符出現的次數
輸入
測試輸入包含若干測試用例,每個測試用例包含2行,第1行爲一個長度不超過5的字符串,第2行爲一個長度不超過80的字符串。注意這裏的字符串包含空格,即空格也可能是要求被統計的字符之一。當讀到’#'時輸入結束,相應的結果不要輸出。
輸出
對每個測試用例,統計第1行中字符串的每個字符在第2行字符串中出現的次數,按如下格式輸出:
c0 n0
c1 n1
c2 n2
…
其中ci是第1行中第i個字符,ni是ci出現的次數。
#include <stdio.h>
#include <string.h>
int main(){
char s1[6];
char s2[81];
int s1_length;
int s2_length;
int i;
int j;
int time;
char c;
while(1){
i=0; //s1包含空格
while((c=getchar())!='\n'){
s1[i]=c;
i++;
}
s1[i]='\0';
if(s1[0]=='#')
break;
i=0; //s2包含空格
while((c=getchar())!='\n'){
s2[i]=c;
i++;
}
s2[i]='\0';
s1_length=strlen(s1);
s2_length=strlen(s2);
for(i=0;i<s1_length;i++){
time=0;
for(j=0;j<s2_length;j++){
if(s1[i]==s2[j])
time++;
}
printf("%c %d\n",s1[i],time);
}
}
return 0;
}
完數
完數的定義:如果一個大於1的正整數的所有因子之和等於它的本身,則稱這個數是完數,比如6,28都是完數:6=1+2+3;28=1+2+4+7+14。
輸入
輸入數據包含多行,第一行是一個正整數n,表示測試實例的個數,然後就是n個測試實例,每個實例佔一行,由兩個正整數num1和num2組成,(1<num1,num2<10000) 。
輸出
對於每組測試數據,請輸出num1和num2之間(包括num1和num2)存在的完數個數。
#include <stdio.h>
int if_perfect_number(int number);
int main(){
int T;
int number1;
int number2;
int temp;
int i;
int amount;
scanf("%d",&T);
while(T--){
amount=0;
scanf("%d%d",&number1,&number2);
if(number1>number2){
temp=number1;
number1=number2;
number2=temp;
}
for(i=number1;i<=number2;i++){
if(if_perfect_number(i)==1)
amount++;
}
printf("%d\n",amount);
}
return 0;
}
int if_perfect_number(int number){
int i;
int sum;
sum=0;
for(i=1;i<=number/2;i++){
if(number%i==0)
sum+=i;
}
if(sum==number)
return 1;
else
return 0;
}
素數迴文
xiaoou33對既是素數又是迴文的數特別感興趣。比如說151既是素數又是個迴文。現在xiaoou333想要你幫助他找出某個範圍內的素數迴文數,請你寫個程序找出 a 跟b 之間滿足條件的數。(5 <= a < b <= 100,000,000);
輸入
這裏有許多組數據,每組包括兩組數據a跟b。
輸出
對每一組數據,按從小到大輸出a,b之間所有滿足條件的素數迴文數(包括a跟b)每組數據之後空一行。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 10000000 //9999999是題目要求範圍的最大回文數
char flag[N];
int palindrome_number(int number);
int main(){
int i;
int j;
int a;
int b;
memset(flag,'0',N);
flag[0]='1';
flag[1]='1';
for(i=2;i<=sqrt((double)N);i++){
if(flag[i]=='0'){
for(j=i*i;j<N;j+=i)
flag[j]='1';
}
}
while(scanf("%d%d",&a,&b)!=EOF){
for(i=a;i<=b;i++){
if(i>N-1)
continue;
if(palindrome_number(i)==1 && flag[i]=='0')
printf("%d\n",i);
}
printf("\n");
}
return 0;
}
int palindrome_number(int number){
int array[9];
int i;
int length;
int flag;
i=0;
while(number){
array[i]=number%10;
i++;
number/=10;
}
length=i;
flag=0;
for(i=0;i<length/2;i++){
if(array[i]!=array[length-i-1]){
flag=1;
break;
}
}
if(flag==1)
return 0;
else
return 1;
}
第六部分
快速排序
給你n個整數,請按從大到小的順序輸出其中前m大的數。
輸入
每組測試數據有兩行,第一行有兩個數n,m(0<n,m<1000000),第二行包含n個各不相同,且都處於區間[-500000,500000]的整數。
輸出
對每組測試數據按從大到小的順序輸出前m大的數。
#include <stdio.h>
void quickSort(int a[],int left,int right);
int array[1000001];
int main(){
int n;
int m;
int i;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<n;i++)
scanf("%d",&array[i]);
quickSort(array,0,n-1);
for(i=n-1;i>n-m-1;i--){
if(i==n-1)
printf("%d",array[i]);
else
printf(" %d",array[i]);
}
printf("\n");
}
return 0;
}
void quickSort(int a[],int left,int right){
int i;
int j;
int temp;
i=left;
j=right;
temp=a[left];
if(left>=right)
return;
while(i!=j){
while(i<j && a[j]>=temp)
j--;
if(i<j){
a[i]=a[j];
}
while(i<j && a[i]<=temp)
i++;
if(i<j){
a[j]=a[i];
}
}
a[i]=temp;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
開門人和關門人
每天第一個到機房的人要把門打開,最後一個離開的人要把門關好。現有一堆雜亂的機房籤
到、籤離記錄,請根據記錄找出當天開門和關門的人。
輸入
測試輸入的第一行給出記錄的總天數N ( > 0 )。下面列出了N天的記錄。
每天的記錄在第一行給出記錄的條目數M ( > 0 ),下面是M行,每行的格式爲
證件號碼 簽到時間 籤離時間
其中時間按“小時:分鐘:秒鐘”(各佔2位)給出,證件號碼是長度不超過15的字符串。
輸出
對每一天的記錄輸出1行,即當天開門和關門人的證件號碼,中間用1空格分隔。
注意:在裁判的標準測試輸入中,所有記錄保證完整,每個人的簽到時間在籤離時間之前,
且沒有多人同時簽到或者籤離的情況。
#include <stdio.h>
#include <string.h>
int main(){
int N;
int M;
int i;
char ID[16];
char minID[16];
char maxID[16];
char s1[9];
char s2[9];
char time1[7];
char time2[7];
char minTime[7];
char maxTime[7];
scanf("%d",&N);
while(N--){
scanf("%d",&M);
for(i=0;i<M;i++){
scanf("%s%s%s",ID,s1,s2);
time1[0]=s1[0];
time1[1]=s1[1];
time1[2]=s1[3];
time1[3]=s1[4];
time1[4]=s1[6];
time1[5]=s1[7];
time1[6]='\0';
time2[0]=s2[0];
time2[1]=s2[1];
time2[2]=s2[3];
time2[3]=s2[4];
time2[4]=s2[6];
time2[5]=s2[7];
time2[6]='\0';
if(i==0){
strcpy(minID,ID);
strcpy(maxID,ID);
strcpy(minTime,time1);
strcpy(maxTime,time2);
continue;
}
if(strcmp(time1,minTime)<0){
strcpy(minID,ID);
strcpy(minTime,time1);
}
if(strcmp(time2,maxTime)>0){
strcpy(maxID,ID);
strcpy(maxTime,time2);
}
}
printf("%s %s\n",minID,maxID);
}
return 0;
}
雞兔同籠
已知雞和兔的總數量爲n,總腿數爲m。輸入n和m,依次輸出雞和兔的數目,如果無解,則輸出“No answer”(不要引號)。
輸入
第一行輸入一個數據a,代表接下來共有幾組數據,在接下來的(a<10)、a行裏,每行都有一個n和m.(0<m,n<100)
輸出
輸出雞兔的個數,或者No answer
#include <stdio.h>
int main(){
int T;
int n;
int m;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
if((m-2*n)>=0 && (m-2*n)%2==0 && (4*n-m)>=0 && (4*n-m)%2==0)
printf("%d %d\n",(4*n-m)/2,(m-2*n)/2);
else
printf("No answer\n");
}
return 0;
}
日期計算
如題,輸入一個日期,格式如:2010 10 24 ,判斷這一天是這一年中的第幾天。
輸入
第一行輸入一個數N(0<N<=100),表示有N組測試數據。後面的N行輸入多組輸入數據,每行的輸入數據都是一個按題目要求格式輸入的日期。
輸出
每組輸入數據的輸出佔一行,輸出判斷出的天數n
#include <stdio.h>
int main(){
int T;
int a;
int b;
int c;
int i;
int day[13];
int amount;
day[1]=31;
day[2]=28;
day[3]=31;
day[4]=30;
day[5]=31;
day[6]=30;
day[7]=31;
day[8]=31;
day[9]=30;
day[10]=31;
day[11]=30;
day[12]=31;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&a,&b,&c);
amount=0;
for(i=1;i<b;i++)
amount+=day[i];
amount+=c;
if((a%400==0 || (a%4==0 && a%100!=0)) && i>=3)
amount++;
printf("%d\n",amount);
}
return 0;
}
開燈問題
有n盞燈,編號爲1~n,第1個人把所有燈打開,第2個人按下所有編號爲2 的倍數的開關(這些燈將被關掉),第3 個人按下所有編號爲3的倍數的開關(其中關掉的燈將被打開,開着的燈將被關閉),依此類推。一共有k個人,問最後有哪些燈開着?輸入:n和k,輸出開着的燈編號。k≤n≤1000
輸入
輸入一組數據:n和k
輸出
輸出開着的燈編號
#include <stdio.h>
#include <string.h>
int main(){
int n;
int k;
int flag[1001];
int i;
int j;
scanf("%d%d",&n,&k);
memset(flag,0,sizeof(int)*1001);
for(i=1;i<=k;i++){
for(j=1;j<=n;j++){
if(j%i==0){
if(flag[j-1]==0)
flag[j-1]=1;
else
flag[j-1]=0;
}
}
}
for(i=0;i<n;i++){
if(flag[i]==1){
printf("%d",i+1);
flag[i]=0;
break;
}
}
for(i=0;i<n;i++){
if(flag[i]==1)
printf(" %d",i+1);
}
printf("\n");
return 0;
}
第七部分
字符串替換
編寫一個程序實現將字符串中的所有"you"替換成"we"
輸入
輸入包含多行數據
每行數據是一個字符串,長度不超過1000
數據以EOF結束
輸出
對於輸入的每一行,輸出替換後的字符串
#include <stdio.h>
#include <string.h>
int main(){
char c;
char s[1001];
int i;
int length;
while(scanf("%c",&c)!=EOF){
i=0;
while(c!='\n'){
s[i]=c;
i++;
c=getchar();
}
s[i]='\0';
length=strlen(s);
for(i=0;i<length-2;i++){ //這裏處理很巧妙,直接賦值即可,真是高
if(s[i]=='y' && s[i+1]=='o' && s[i+2]=='u'){
s[i]='w';
s[i+1]='e';
s[i+2]='\0'; //賦值爲'\0',是因爲其他位置的字符不可能爲'\0'
}
}
for(i=0;i<length;i++){
if(s[i]!='\0')
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}
字母統計
現在給你一個由小寫字母組成字符串,要你找出字符串中出現次數最多的字母,如果出現次數最多字母有多個那麼輸出最小的那個。
輸入
第一行輸入一個正整數T(0<T<25)隨後T行輸入一個字符串s,s長度小於1010。
輸出
每組數據輸出佔一行,輸出出現次數最多的字符;
#include <stdio.h>
#include <string.h>
int main(){
char s[1100];
int T;
int amount[27];
int i;
int max;
char c;
scanf("%d",&T);
while(T--){
scanf("%s",&s);
memset(amount,0,sizeof(int)*27);
for(i=0;s[i]!='\0';i++){
amount[s[i]-'a'+1]++;
}
for(i=1;i<=26;i++){
if(amount[i]!=0){
c=i-1+'a';
max=amount[i];
break;
}
}
for(i=1;i<=26;i++){
if(amount[i]>max){
c=i-1+'a';
max=amount[i];
}
}
printf("%c\n",c);
}
return 0;
}
字符串逆序輸出
給定一行字符,逆序輸出此行(空格.數字不輸出)
輸入
第一行是一個整數N(N<10)表示測試數據的組數)
每組測試數據佔一行,每行數據中間有且只有一個空格(這樣你可以把此行當成兩個字符串讀取)。
每行字符長度不超過40
並且保證輸入的字符只有空格(1個),數字,小寫字母三種
輸出
對應每行測試數據,逆序輸出(空格和數字不輸出)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(){
char s[50];
int T;
int length;
int i;
scanf("%d",&T);
getchar();
while(T--){
gets(s);
length=strlen(s);
for(i=length-1;i>=0;i--){
if(isalpha(s[i]))
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}
交換輸出
輸入n(n<100)個數,找出其中最小的數,將它與最前面的數交換後輸出這些數。(如果這個第一個數就是最小的數,則保持原樣輸出,如果最小的數有相同的按照前面的交換)
輸入
輸入數據有多組,每組佔一行,每行的開始是一個整數n,表示這個測試實例的數值的個數,跟着就是n個整數。n=0表示輸入的結束,不做處理。
輸出
對於每組輸入數據,輸出交換後的數列,每組輸出佔一行。
#include <stdio.h>
int main(){
int n;
int number[101];
int i;
int min;
int flag;
int temp;
while(1){
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
scanf("%d",&number[i]);
flag=0;
min=number[0];
for(i=0;i<n;i++){
if(number[i]<min){
min=number[i];
flag=i;
}
}
temp=number[0];
number[0]=number[flag];
number[flag]=temp;
for(i=0;i<n;i++){
if(i!=0)
printf(" ");
printf("%d",number[i]);
}
printf("\n");
}
return 0;
}
比較字母大小
任意給出兩個英文字母,比較它們的大小,規定26個英文字母A,B,C…Z依次從大到小。
輸入
第一行輸入T,表示有T組數據;接下來有T行,每行有兩個字母,以空格隔開;
輸出
輸出各組數據的比較結果,輸出格式見樣例輸出;(注意輸出嚴格按照輸入的順序即輸入是A B,輸出時必須是A?B)
#include <stdio.h>
int main(){
int T;
char a;
char b;
char compare;
scanf("%d",&T);
getchar();
while(T--){
scanf("%c %c",&a,&b);
getchar();
if(a==b)
compare='=';
else if(a>b)
compare='<';
else
compare='>';
printf("%c%c%c\n",a,compare,b);
}
return 0;
}
第八部分
猴子喫桃問題
有一堆桃子不知數目,猴子第一天喫掉一半,又多吃了一個,第二天照此方法,喫掉剩下桃子的一半又多一個,天天如此,到第m天早上,猴子發現只剩一隻桃子了,問這堆桃子原來有多少個? (m<29)
輸入
第一行有一個整數n,表示有n組測試數據(從第二行開始,每一行的數據爲:第m天);
輸出
每一行數據是桃子的總個數
#include <stdio.h>
int main(){
int T;
int m;
int i;
int result;
scanf("%d",&T);
while(T--){
scanf("%d",&m);
result=1;
for(i=1;i<=m;i++)
result=(result+1)*2;
printf("%d\n",result);
}
return 0;
}
九九乘法表
小時候學過的九九乘法表也許將會紮根於我們一生的記憶,現在讓我們重溫那些溫暖的記憶,請編程輸出九九乘法表.
現在要求你輸出它的格式與平常的 不同啊! 是那種反過來的三角形啦,具體如下圖:
每兩個式子之前用一個空格 隔開。。。
輸入
第一有一個整數N,表示有N組數據(N<10)接下來由N行,每行只有一個整數M(1<=M<=9);
輸出
對應每個整數M,根據要求輸出乘法表的前N行,具體格式參見輸入輸出樣例和上圖.每兩組測試數據結果之間有一個空行隔開,
#include <stdio.h>
#include <math.h>
int main(){
int T;
int n;
int i;
int j;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=i;j<=9;j++){
if(j!=i)
printf(" ");
printf("%d*%d=%d",i,j,i*j);
}
printf("\n");
}
if(T!=0)
printf("\n");
}
return 0;
}
16進制的簡單運算
現在給你一個16進制的加減法的表達式,要求用8進制輸出表達式的結果。
輸入
第一行輸入一個正整數T(0<T<100000)
接下來有T行,每行輸入一個字符串s(長度小於15)字符串中有兩個數和一個加號或者一個減號,且表達式合法並且所有運算的數都小於31位
輸出
每個表達式輸出佔一行,輸出表達式8進制的結果。
#include <stdio.h>
int main(){
int a;
int b;
int sum;
int T;
char c;
scanf("%d",&T);
while(T--){
scanf("%x%c%x",&a,&c,&b);
if(c=='+')
sum=a+b;
else
sum=a-b;
if(sum<0){ //只有當sum爲__int64類型時,纔要進行正負的判斷
sum=-sum;
printf("-");
}
printf("%o\n",sum);
}
return 0;
}
三角形面積
給你三個點,表示一個三角形的三個頂點,現你的任務是求出該三角形的面積
輸入
每行是一組測試數據,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。(座標值都在0到10000之間)輸入0 0 0 0 0 0表示輸入結束。測試數據不超過10000組
輸出
輸出這三個點所代表的三角形的面積,結果精確到小數點後1位(即使是整數也要輸出一位小數位)
#include <stdio.h>
#include <math.h>
int main(){
int x1;
int y1;
int x2;
int y2;
int x3;
int y3;
double s;
while(1){
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
if(x1==0 && y1==0 && x2==0 && y2==0 && x3==0 && y3==0)
break;
s=fabs((double)x1*y2-x2*y1+x3*y1-x1*y3+x2*y3-x3*y2)/2;
printf("%.1lf\n",s);
}
return 0;
}
平方和與立方和
給定一段連續的整數,求出他們中所有偶數的平方和以及所有奇數的立方和。
輸入
輸入數據包含多組測試實例,每組測試實例包含一行,由兩個整數m和n組成。
輸出
對於每組輸入數據,輸出一行,應包括兩個整數x和y,分別表示該段連續的整數中所有偶數的平方和以及所有奇數的立方和。你可以認爲32位整數足以保存結果。
#include <stdio.h>
int main(){
int a;
int b;
int i;
int temp;
int oushu_sum;
int jishu_sum;
while((scanf("%d%d",&a,&b))!=EOF){
oushu_sum=0;
jishu_sum=0;
if(a>b){
temp=a;
a=b;
b=temp;
}
for(i=a;i<=b;i++){
if(i%2==0){
oushu_sum+=(i*i);
}
else
jishu_sum+=(i*i*i);
}
printf("%d %d\n",oushu_sum,jishu_sum);
}
return 0;
}
第九部分
水仙花數
春天是鮮花的季節,水仙花就是其中最迷人的代表,數學上有個水仙花數,他是這樣定義的:
“水仙花數”是指一個三位數,它的各位數字的立方和等於其本身,比如:153=13+53+3^3。
現在要求輸出所有在m和n範圍內的水仙花數。
輸入
輸入數據有多組,每組佔一行,包括兩個整數m和n(100<=m<=n<=999)。
輸出
對於每個測試實例,要求輸出所有在給定範圍內的水仙花數,就是說,輸出的水仙花數必須大於等於m,並且小於等於n,如果有多個,則要求從小到大排列在一行內輸出,之間用一個空格隔開;
如果給定的範圍內不存在水仙花數,則輸出no;
每個測試實例的輸出佔一行。
#include <stdio.h>
int main(){
int a;
int b;
int temp;
int i;
int number1;
int number2;
int number3;
int flag;
while((scanf("%d%d",&a,&b))!=EOF){
flag=0;
if(a>b){
temp=a;
a=b;
b=temp;
}
for(i=a;i<=b;i++){
number1=i%10;
number2=i/10%10;
number3=i/100;
if(i==(number1*number1*number1+number2*number2*number2+number3*number3*number3)){
if(flag==0)
printf("%d",i);
else
printf(" %d",i);
flag=1;
}
}
if(flag==0)
printf("no");
printf("\n");
}
return 0;
}
多項式求和
多項式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …
現在請你求出該多項式的前n項的和。
輸入
輸入數據由2行組成,首先是一個正整數m(m<100),表示測試實例的個數,第二行包含m個正整數,對於每一個整數(不妨設爲n,n<1000),求該多項式的前n項的和。
輸出
對於每個測試實例n,要求輸出多項式前n項的和。每個測試實例的輸出佔一行,結果保留2位小數。
#include <stdio.h>
double get_result(int number);
int main(){
int n;
int number;
scanf("%d",&n);
while(n--){
scanf("%d",&number);
printf("%.2lf\n",get_result(number));
}
return 0;
}
double get_result(int number){
int i;
int temp=1;
double result=0;
for(i=1;i<=number;i++){
result+=(1.0/i*temp);
temp=-temp;
}
return result;
}
絕對值排序
輸入n(n<=100)個整數,按照絕對值從大到小排序後輸出。題目保證對於每一個測試實例,所有的數的絕對值都不相等。
輸入
輸入數據有多組,每組佔一行,每行的第一個數字爲n,接着是n個整數,n=0表示輸入數據的結束,不做處理
輸出
對於每個測試實例,輸出排序後的結果,兩個數之間用一個空格隔開。每個測試實例佔一行。
#include <stdio.h>
#include <math.h>
int main(){
int n;
int number[101];
int i;
int j;
int temp;
while(1){
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
scanf("%d",&number[i]);
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(fabs(number[i])<(fabs(number[j]))){
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
}
}
for(i=0;i<n;i++){
printf("%d",number[i]);
if(i!=n-1)
printf(" ");
}
printf("\n");
}
return 0;
}
首字母變大寫
輸入一個英文句子,將每個單詞的第一個字母改成大寫字母。
輸入
輸入數據包含多個測試實例,每個測試實例是一個長度不超過100的英文句子,佔一行。
輸出
請輸出按照要求改寫後的英文句子。
#include <stdio.h>
#include <ctype.h>
int main(){
char c;
int flag;
while((scanf("%c",&c))!=EOF){
flag=1;
while(c!='\n'){
if(islower(c)!=0 && flag==1){
c=toupper(c);
flag=0;
}
if(c==' ')
flag=1;
printf("%c",c);
c=getchar();
}
printf("\n");
}
return 0;
}
a/b + c/d
給你2個分數,求他們的和,並要求和爲最簡形式。
輸入
輸入首先包含一個正整數T(T<=1000),表示有T組測試數據,然後是T行數據,每行包含四個正整數a,b,c,d(0<a,b,c,d<1000),表示兩個分數a/b 和 c/d。
輸出
對於每組測試數據,輸出兩個整數e和f,表示a/b + c/d的最簡化結果是e/f,每組輸出佔一行。
#include <stdio.h>
int get_gcd(int a,int b);
int main(){
int T;
int a;
int b;
int c;
int d;
int lcm;
int temp;
int gcd;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&d);
lcm=b*d/get_gcd(b,d);
temp=(lcm/b*a+lcm/d*c);
gcd=get_gcd(temp,lcm);
printf("%d %d\n",temp/gcd,lcm/gcd);
}
return 0;
}
int get_gcd(int a,int b){
int temp;
int remainder;
if(a<b){
temp=a;
a=b;
b=temp;
}
while(a%b){
remainder=a%b;
a=b;
b=remainder;
}
return b;
}
某些人看這
通過這最基礎的思想學習,小白的你總算是想起來了吧~