《1》Fibonacci數列 ios
問題描述 c++
Fibonacci數列的遞推公式爲:Fn=Fn-1+Fn-2,其中F1=F2=1。 算法
當n比較大時,Fn也很是大,如今咱們想知道,Fn除以10007的餘數是多少。 編程
輸入格式 數組
輸入包含一個整數n。 函數
輸出格式 測試
輸出一行,包含一個整數,表示Fn除以10007的餘數。 大數據
說明:在本題中,答案是要求Fn除以10007的餘數,所以咱們只要能算出這個餘數便可,而不須要先計算出Fn的準確值,再將計算的結果除以10007取餘數,直接計算餘數每每比先算出原數再取餘簡單。 spa
樣例輸入 設計
10
樣例輸出
55
樣例輸入
22
樣例輸出
7704
心得體會:
其實從題目中能夠知道,能夠直接求Fn mod 10007=(Fn-1+Fn-2) mod 10007,既爲答案。之因此取餘是由於Fn可能太大,因此取餘存儲,這在其餘的處理大數據的題中也經常會出現。此題能夠用遞歸算法實現,也能夠用循環。
參考代碼:
//<循環實現> #include<stdio.h> int f[3],n;//不須要存儲中間結果,因此只須要長度爲2的素組便可 int main() { f[1]=f[2]=1; scanf("%d",&n); int i=3,t; while(i<=n) { t=(f[1]+f[2])%10007; f[1]=f[2]; f[2]=t; i++; } printf("%d\n",f[2]); return 0; } //<遞歸實現> #include <stdio.h> #include <stdlib.h> int fab(int n) { int r; if(n==1 || n==2) { return 1; } else { return (fab(n-1)+fab(n-2))%10007; } } int main() { int a,r; scanf("%d",&a); while(a!=-1) { r=fab(a); printf("輸入:%d,輸出餘數:%d\n",a,r); scanf("%d",&a); } return 0; }
《2》圓的面積
說明:在本題中,輸入是一個整數,可是輸出是一個實數。
對於實數輸出的問題,請必定看清楚實數輸出的要求,好比本題中要求保留小數點後7位,則你的程序必須嚴格的輸出7位小數,輸出過多或者過少的小數位數都是不行的,都會被認爲錯誤。
實數輸出的問題若是沒有特別說明,舍入都是按四捨五入進行。
#include <stdio.h> #include <stdlib.h> #define PI 3.14159265358979323 int main() { int r; double s; scanf("%d",&r); s=(double)PI*r*r;//顯示加上類型強制轉換,以避免錯誤 printf("%.7f",s); return 0; }
《3》序列求和
說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的作題。
通常在提交以前全部這些樣例都須要測試經過才行,但這不表明這幾組樣例數據都正確了你的程序就是徹底正確的,潛在的錯誤可能仍然致使你的得分較低。
說明:請注意這裏的數據規模。
本題直接的想法是直接使用一個循環來累加,然而,當數據規模很大時,這種「暴力」的方法每每會致使超時。此時你須要想一想其餘方法。你能夠試一試,若是使用1000000000做爲你的程序的輸入,你的程序是否是能在規定的上面規定的時限內運行出來。
本題另外一個要值得注意的地方是答案的大小不在你的語言默認的整型(int)範圍內,若是使用整型來保存結果,會致使結果錯誤。
若是你使用C++或C語言並且準備使用printf輸出結果,則你的格式字符串應該寫成%I64d(或%lld)以輸出long long類型的整數。
參考代碼:
#include<stdio.h>
int main()
{
long long n,result;
scanf("%lld",&n);
printf("%lld",(1+n)*n/2);
return 0;
}
《3》A+B問題
問題描述
輸入A、B,輸出A+B。
說明:在「問題描述」這部分,會給出試題的意思,以及所要求的目標。
輸入格式
輸入的第一行包括兩個整數,由空格分隔,分別表示A、B。
說明:「輸入格式」是描述在測試你的程序時,所給的輸入必定知足的格式。 作題時你應該假設所給的輸入是必定知足輸入格式的要求的,因此你不須要對輸入的格式進行檢查。多餘的格式檢查可能會拔苗助長,使用你的程序錯誤。
在測試的時候,系統會自動將輸入數據輸入到你的程序中,你不能給任何提示。好比,你在輸入的時候提示「請輸入A、B」之類的話是不須要的,這些多餘的輸出會使得你的程序被斷定爲錯誤。
輸出格式
輸出一行,包括一個整數,表示A+B的值。
說明:「輸出格式」是要求你的程序在輸出結果的時候必須知足的格式。
在輸出時,你的程序必須知足這個格式的要求,不能少任何內容,也不能多任何內容。若是你的內容和輸出格式要求的不同,你的程序會被判斷爲錯誤,包括你輸出了提示信息、中間調試信息、計時或者統計的信息等。
樣例輸入
12 45
說明:「樣例輸入」給出了一組知足「輸入格式」要求的輸入的例子。 這裏給出的輸入只是可能用來測試你的程序的一個輸入,在測試的時候,還會有更多的輸入用來測試你的程序。
樣例輸出
57
說明:「樣例輸出」給出了一組知足「輸出格式」要求的輸出的例子。 樣例輸出中的結果是和樣例輸入中的是對應的,所以,你可使用樣例的輸入輸出簡單的檢查你的程序。
要特別指出的是,可以經過樣例輸入輸出的程序並不必定是正確的程序,在測試的時候,會用不少組數據進行測試,而不侷限於樣例數據。有可能一個程序經過了樣例數據,但測試的
時候仍只能得0分,可能由於這個程序只在一些相似樣例的特例中正確,而不具備通用性,再測試更多數據時會出現錯誤。
好比,對於本題,若是你寫一個程序無論輸入是什麼都輸入57,則樣例數據是對的,可是測試其餘數據,哪怕輸入是1和2,這個程序也輸出57,則對於其餘數據這個程序都不正確。
數據規模與約定
-10000 <= A, B <= 10000。
說明:「數據規模與約定」中給出了試題中主要參數的範圍。
這個範圍對於解題很是重要,不一樣的數據範圍會致使試題須要使用不一樣的解法來解決。好比本題中給的A、B範圍不大,可使用整型(int)來保存,若是範圍更大,超過int的範圍,則要考慮其餘方法來保存大數。
有一些範圍在方便的時候是在「問題描述」中直接給的,因此在作題時不只要看這個範圍,還要注意問題描述。
參考程序
#include<stdio.h> #include<stdlib.h> int main() { int a,b; scanf("%d%d",&a,&b); printf("%d\n",a+b); return 0; }
問題描述
給定一個年份,判斷這一年是否是閏年。 當如下狀況之一知足時,這一年是閏年: 1. 年份是4的倍數而不是100的倍數; 2. 年份是400的倍數。 其餘的年份都不是閏年。
輸入格式
輸入包含一個整數y,表示當前的年份。
輸出格式
輸出一行,若是給定的年份是閏年,則輸出yes,不然輸出no。
說明:當試題指定你輸出一個字符串做爲結果(好比本題的yes或者no,你須要嚴格按照試題中給定的大小寫,寫錯大小寫將不得分。
樣例輸入
2013
樣例輸出
no
樣例輸入
2016
樣例輸出
yes
數據規模與約定
1990 <= y <= 2050。
心得體會:閏年的判斷條件常常會在其餘地方用到,而且題目是不會給出提示的,因此應該熟記閏年的判斷條件。
參考代碼
#include<stdio.h> #include<stdlib.h> int main() { int year; scanf("%d",&year); if( ( year%4 == 0 && year%100 !=0 ) || year%400==0 ) { printf("yes"); } else { printf("no"); } return 0; }
問題描述
對於長度爲5位的一個01串,每一位均可能是0或1,一共有32種可能。它們的前幾個是:
00000
00001
00010
00011
00100
請按從小到大的順序輸出這32種01串。
輸入格式
本試題沒有輸入。
輸出格式
輸出32行,按從小到大的順序每行一個長度爲5的01串。
樣例輸出
00000
00001
00010
00011
<如下部分省略>
題目分析
其實根據題目的意思能夠知道,是要將十進制的0-31從小到大以二進制的形式輸出。因此能夠按從小到大的順序將0-31轉化成二進制輸出。
固然這題也能夠用5重嵌套循環實現。
參考代碼
#include<stdio.h> #include<stdlib.h> int main() { int num = 31; int binary[5]; int i,j,k; for(i=0; i<=num; i++) { k=i; for( j=0; j<5; j++) { binary[j]=k%2; k = k/2; } for( j=4; j>=0; j--)//反向輸出 { printf("%d",binary[j]); } printf("\n"); } return 0; }
問題描述
利用字母能夠組成一些美麗的圖形,下面給出了一個例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
這是一個5行7列的圖形,請找出這個圖形的規律,並輸出一個n行m列的圖形。
輸入格式
輸入一行,包含兩個整數n和m,分別表示你要輸出的圖形的行數的列數。
輸出格式
輸出n行,每一個m個字符,爲你的圖形。
樣例輸入
5 7
樣例輸出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
數據規模與約定
1 <= n, m <= 26。
參考代碼(作圖形打印的題目要善於發現圖形的分佈規律,按照分析的規律準確輸出圖形便可)
#include<stdio.h> #include<stdlib.h> #define M 26 char graph[M][M]; int main() { int n,m; char c1='A',c2; scanf("%d%d",&n,&m); int i,j; for(i=0;i<n;i++) {
//打印一行字符 graph[i][i]=c1;//A for(c2=c1+1,j=i-1;j>=0;j--,c2++)graph[i][j]=c2;//A前面的字符 for(c2=c1+1,j=i+1;j<m;j++,c2++)graph[i][j]=c2;//A後面的字符 } for(i=0;i<n;i++) { for(j=0;j<m;j++)printf("%c",graph[i][j]); printf("\n"); } return 0; }
問題描述
給出n個數,找出這n個數的最大值,最小值,和。
輸入格式
第一行爲整數n,表示數的個數。
第二行有n個數,爲給定的n個數,每一個數的絕對值都小於10000。
輸出格式
輸出三行,每行一個整數。第一行表示這些數中的最大值,第二行表示這些數中的最小值,第三行表示這些數的和。
樣例輸入
5
1 3 -2 4 5
樣例輸出
5
-2
3
數據規模與約定
1 <= n <= 10000。
參考代碼
#include<stdio.h> #include<stdlib.h> int main() { int n,i,a; scanf("%d",&n); int num[n]; for( i=0; i<n; i++) { scanf("%d",&num[i]); } int min = num[0];//min和max的值還能夠經過調用函數min()和max()求得 int max = num[0]; int sum = num[0]; for( i=1; i<n; i++) { sum = sum + num[i]; if( num[i] > max) { max = num[i]; } if( num[i] < min) { min = num[i]; } } printf("%d\n%d\n%d\n",max,min,sum); return 0; }
問題描述
給出一個包含n個整數的數列,問整數a在數列中的第一次出現是第幾個。
輸入格式
第一行包含一個整數n。
第二行包含n個非負整數,爲給定的數列,數列中的每一個數都不大於10000。
第三行包含一個整數a,爲待查找的數。
輸出格式
若是a在數列中出現了,輸出它第一次出現的位置(位置從1開始編號),不然輸出-1。
樣例輸入
6
1 9 4 8 3 9
9
樣例輸出
2
數據規模與約定
1 <= n <= 1000。
心得體會
熟練運用C++中<algoritm>所提供的函數能夠減小本身編寫相應代碼的時間。
參考代碼
//調用<algorithm>中的find函數進行查找 #include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; int main() { int n,a; scanf("%d",&n); int num[n],i; for(i=0;i<n;i++)scanf("%d",&num[i]); scanf("%d",&a); int *resul=find(num,num+n,a);//find(start,end,num_to_find);若找到這result指向查找值的位置,找不到的話會返回一個「逾尾」的迭代器 printf("%d",resul-num+1); return 0; } //本身編寫查找代碼 #include<stdio.h> #include<stdlib.h> int main() { int count,find; scanf("%d",&count); int num[count]; int i; for( i=0; i<count; i++) { scanf("%d",&num[i]); } scanf("%d",&find); int k=-1; for( i=0; i<count; i++) { if( num[i] == find ) { k=i+1; break; } } printf("%d",k); return 0; }
問題描述
楊輝三角形又稱Pascal三角形,它的第i+1行是(a+b)i的展開式的係數。
它的一個重要性質是:三角形中的每一個數字等於它兩肩上的數字相加。
下面給出了楊輝三角形的前4行:
1
1 1
1 2 1
1 3 3 1
給出n,輸出它的前n行。
輸入格式
輸入包含一個數n。
輸出格式
輸出楊輝三角形的前n行。每一行從這一行的第一個數開始依次輸出,中間使用一個空格分隔。請不要在前面輸出多餘的空格。
樣例輸入
4
樣例輸出
1
1 1
1 2 1
1 3 3 1
數據規模與約定
1 <= n <= 34。
參考代碼(此題爲圖形打印題,只要掌握了圖形的變化規律,按照規律輸出便可)
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 34 int main() { int n,i,j,num[MAXSIZE][MAXSIZE]; scanf("%d",&n); num[0][0] = 1; printf("%d\n",num[0][0]); for( i=1; i<n; i++) { num[i][0] = 1; printf("%d ",num[i][0]); for( j=1; j<=i-1; j++) { num[i][j] = num[i-1][j-1]+num[i-1][j]; printf("%d ",num[i][j]); } num[i][i] = 1; printf("%d\n",num[i][i]); } return 0; }
問題描述
153是一個很是特殊的數,它等於它的每位數字的立方和,即153=1*1*1+5*5*5+3*3*3。編程求全部知足這種條件的三位十進制數。
輸出格式
按從小到大的順序輸出知足條件的三位十進制數,每一個數佔一行。
分析
本題是要求三位數的水仙花數,既從100-999間的水仙花數,能夠利用三重嵌套實現,既可另i,j,k分別表明百位、十位、個位。也能夠寫一個判斷水仙花數的函數,這個函數將一個整數拆分爲單個數字,而後判斷。
參考程序
#include<stdio.h> #include<stdlib.h> #define MAXNUM 1000 #define MINNUM 100 int isflower(int num) { int sum = 0; int k = num; int i; while( k ) { i = k % 10; sum += i*i*i; k = k/10; } if( num == sum ) { return 1; } else { return 0; } } int main() { int i; for ( i=MINNUM; i<MAXNUM ; i++) { if ( isflower(i)) { printf("%d\n",i); } } return 0; }
問題描述
1221是一個很是特殊的數,它從左邊讀和從右邊讀是同樣的,編程求全部這樣的四位十進制數。
輸出格式
按從小到大的順序輸出知足條件的四位十進制數。
分析
此題能夠用四重嵌套循環實現,i,j,k,m表示從百位到十位的數字,當i==m&&j==k的時候數字知足要求。固然也能夠另寫一個判斷函數,將整形參數拆分後再進行判斷。
參考代碼
//嵌套循環代碼 #include<stdio.h> int main() { int i,j,k,m; for(i=1;i<10;i++) { for(j=0;j<10;j++) { for(k=0;k<10;k++) { for(m=0;m<10;m++) { if(i==m&&j==k) { printf("%d\n",i*1000+j*100+k*10+m); } } } } } return 0; }
//寫一個判斷函數的代碼 #include<stdio.h> #include<stdlib.h> #define MAXNUM 10000 #define MINNUM 1000 #define COUNT 4 int isbacknum( int num ) { int a[COUNT],i; for ( i=COUNT-1; i>=0; i--) { a[i] = num % 10; num = num/10; } if( a[0]==a[3] && a[1]==a[2]) { return 1; } else { return 0; } } int main() { int i; for( i=MINNUM; i<MAXNUM; i++) { if ( isbacknum(i)) { printf("%d\n",i); } } return 0; }
《9》特殊迴文數
問題描述
123321是一個很是特殊的數,它從左邊讀和從右邊讀是同樣的。
輸入一個正整數n, 編程求全部這樣的五位和六位十進制數,知足各位數字之和等於n 。
輸入格式
輸入一行,包含一個正整數n。
輸出格式
按從小到大的順序輸出知足條件的整數,每一個整數佔一行。
樣例輸入
52
樣例輸出
899998
989989
998899
數據規模和約定
1<=n<=54。
分析
解題方法跟上一題相似,只是多了一個限制條件,也就是各個位數加起來的和等於n
參考代碼
//嵌套循環實現 #include <iostream> using namespace std; int main() { int n,a,b,c,t; cin>>n; for(a=1;a<10;a++)//5位數的狀況 for(b=0;b<10;b++) for(c=0;c<10;c++) { t=a*10001+b*1010+c*100; if(2*a+2*b+c==n) cout<<t<<endl; } for(a=1;a<10;a++)//6位數的狀況 for(b=0;b<10;b++) for(c=0;c<10;c++) { t=a*100001+b*10010+c*1100; if(2*a+2*b+2*c==n) cout<<t<<endl; } return 0; }
//利用判斷函數 #include<stdio.h> #include<stdlib.h> #include<math.h> #define MAXNUM 1000000 #define MINNUM 10000 int isbacknum(int num, int n) { int sum = 0; int a[7]; int i = 1; while( num ) { a[i] = num % 10; sum += a[i]; num = num / 10; i++; } i--; int j; int k = floor(i/2); for ( j=1; j<=k ; j++) { if( a[j] != a[i-j+1] ) { break; } } if( j>k && sum == n) { return 1; } else { return 0; } } int main() { int i,n; scanf("%d",&n); for ( i=MINNUM; i<MAXNUM; i++) { if (isbacknum(i,n)) { printf("%d\n",i); } } return 0; }
問題描述
十六進制數是在程序設計時常常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進制數的0至15。十六進制的計數方法是滿16進1,因此十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
給出一個非負整數,將它表示成十六進制的形式。
輸入格式
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
輸出這個整數的16進製表示
樣例輸入
30
樣例輸出
1E
分析
十進制轉換成十六進制,能夠採用除以十六取餘法。而且將10-15換成相應的字母便可。此處須要注意邊界值的處理。此外還能夠藉助轉換數組解決這個問題。
參看代碼
#include<stdio.h> #include<stdlib.h> int main() { long long a; int b,i; char c[11]; scanf("%I64d",&a); i=0; if( 0 == a)//這裏必定不能漏了 { printf("%d",0); } else { while (a) { b = a%16; if ( b<10 ) { c[i] = 48 + b; } else { c[i] = 48 + b + 7; } i++; a = a/16; } int j; for ( j=i-1; j>=0; j--)//反向輸出 { printf("%c",c[j]); } } return 0; }
//借用輔助數組 #include <stdio.h> #include <stdlib.h> char data[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //輸出 void Print(char *num,int n) { int i; for(i=n-1;i>=0;i--) printf("%c",num[i]); printf("\0"); printf("\n"); } //將十六進制數轉換爲十進制數 int Transform(char *num,long long value) { int n=0; while(value>=16) { num[n++]=data[value%16]; value/=16; } num[n++]=data[value%16]; return n; } int main() { long long value; char num[10]; int n; scanf("%I64d",&value); n=Transform(num,value); Print(num,n); return 0; }
問題描述
從鍵盤輸入一個不超過8位的正的十六進制數字符串,將它轉換爲正的十進制數後輸出。
注:十六進制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
分析
此題是上一題的逆過程,只要將A-F和十進制的10-15對應起來,假設an爲第n位十六進制數,則十進制數D=an*16^(n-1)+a(n-1)*16^(n-1)+...+a1.
參考代碼
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char data[9]; int i; scanf("%s",data); int len=strlen(data); long long step = 1; long long sum =0; for (i=len-1; i>=0; i--) { if( data[i] <= '9' ) { sum += (data[i]-'0')*step; } else { sum += (data[i]-'A'+10)*step; } step *=16; } printf("%I64d",sum); return 0; }
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行爲一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~九、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每一個十六進制數長度不超過100000。
輸出格式
輸出n行,每行爲輸入對應的八進制正整數。
注意
輸入的十六進制數不會有前導0,好比012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
提示
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
分析
題目說明十六進制的長度在100000,之內。若將十六進制先轉換爲十進制的話,這個通過轉換後獲得的十進制一定沒法存儲。因此此處應該以二進制數爲中間轉換進制,4位二進制能夠標識一位十六進制數,3位二進制能夠表示一位8進制數。轉換成八進制後再去掉前導碼便可。
參考代碼
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define MAXSIZE 100001 void hex2binary( char* hex,char* binary ) { int hex_n = strlen(hex); int value; int i; int k=0; for ( i=0 ; i<hex_n; i++ ) { if ( hex[i] <= '9') { value = hex[i]-'0'; } else { value = hex[i] -'A' +10; } int j; int c=k; for (j=c+3; j>=c; j--) { binary[j] = value % 2 + '0'; value = value / 2; k++; } } binary[k] = '\0'; } void binary2octal ( char* binary, char* octal) { int binary_n = strlen(binary); int i,j=0; int k = binary_n % 3; if( 2==k ) { octal[0] = (binary[0]-'0')*2+binary[1]; j=1; } else if ( 1==k ) { octal[0] = binary[0]; j=1; } int count = strlen(binary); for ( i=k; i<count; i+=3) { octal[j] = (binary[i]-'0')*2*2 + (binary[i+1]-'0')*2 + (binary[i+2]-'0') + '0'; j++; } octal[j] = '\0'; } void display(char *data) { int i=0; int n = strlen(data); int k = 0; while(data[k]=='0') { k++; } if( k==n) { printf("%d",0); } else{ for (i=k; i<n; i++) { printf("%c",data[i]); } } printf("\n"); } int main() { char hex[11][MAXSIZE]; char binary[MAXSIZE*4]; char octal[MAXSIZE*3]; int n,i; scanf("%d",&n); getchar(); for (i=0; i<n; i++) { scanf("%s",hex[i]); } for( i=0; i<n; i++) { hex2binary(hex[i],binary); binary2octal(binary,octal); display(octal); } return 0; }
問題描述
給定一個長度爲n的數列,將這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行爲一個整數n。
第二行包含n個整數,爲待排序的數,每一個整數的絕對值小於10000。
輸出格式
輸出一行,按從小到大的順序輸出排序後的數列。
樣例輸入
5
8 3 6 4 9
樣例輸出
3 4 6 8 9
參考代碼
//選擇排序 #include<stdio.h> #include<stdlib.h> int main() { int n,data[201]; scanf("%d",&n); int i; for( i=0; i<n; i++) { scanf("%d",&data[i]); } int j,temp; for (i=0; i<n; i++) { for( j=i+1; j<n; j++) { if(data[j]<data[i]) { temp = data[j]; data[j] = data[i]; data[i] =temp; } } } for (i=0; i<n; i++) { printf("%d ",data[i]); } return 0; }
//調用sort排序函數 #include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; int a[210]; int main() { int n; scanf("%d",&n); int i; for(i=0;i<n;i++)scanf("%d",&a[i]); sort(a,a+n); for(i=0;i<n;i++)printf("%d ",a[i]); printf("\n"); return 0; }