1. 程式人生 > >【C語言基礎一百題1】C語言基礎100題全新整理版

【C語言基礎一百題1】C語言基礎100題全新整理版

最後一個寒假,想複習一下c語言的基礎知識,正好也做一個查缺補漏的工作,於是找個C語言基礎100題作為練習。

但是原來的100題涉及很多繪圖的問題,而且有些題目過於混亂並且在摘記過程中沒有經過加工,所以我自己對原來的題目做了一下調整並且刪掉了原來的繪圖的題目,在原來題目涉及不多的地方增加了新的題目,新題目多取自譚老的《C語言程式設計》完全可以在VC++6.0環境下執行,100道題目,基本涉及到C語言知識點的所有方面。

雖然都是基礎的題目,但在整個總結的過程中也發現了自己很多問題,自我解決問題的過程也是自己知識提升的過程,相信對於所有學習C語言的朋友來說都是一條必由之路。本人查閱很多的資料,並把問題和資料一併附在100題的篇幅之中,這些資料和知識點大多來自網路,很多轉載無奈本人不能一一查明出處,如果不妥之處還請見諒。

之所以希望總結下100題,一來為了自己對知識做一個小結而心裡踏實,二來感覺網路上資料水平參差不齊,多數只是堆積了事,也希望對於C語言的初學者有一個入門後的提升作用。

本文所涉及知識點題目全部實行取之於民用之於民,在下只是少做整理。所以並不要求朋友做任何出處認證之舉,但懇請您如發現不妥之處給與我嚴厲的指責和批評。

由於本人水平實在一般而且精力有限,所以在調整和總結的過程中不免有很多問題,也希望前輩後輩各界同仁給與指正,在下跪謝於此。

第一部分 C語言的基本結構:順序結構、選擇結構、迴圈結構1-10。

素數,完全平方數 水仙花數 完數 Fibonacci數列 分解因子 最大公約最小公倍

【程式1】
題目:求100之內的素數
1. 程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。 [注意]leap清空。
2.程式原始碼:
#include
#include "math.h"
#define N 101
main()
{
int i,j,line,a[N];
for(i=2;ifor(i=2;ifor(j=i+1;j{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;}
printf("/n");
for(i=2,line=0;i{
if(a[i]!=0)
{printf("%5d",a[i]);
line++;}
if(line==10)
{printf("/n");
line=0;}
}
}
-----------------------------------------------------------------------------
【程式2】
題目:判斷101-200之間有多少個素數,並輸出所有素數。
1.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除, 則表明此數不是素數,反之是素數。 [注意]leap清空。
2.程式原始碼:
#include "math.h"
void main()
{
int m,i,k,h=0,leap=1;
printf("/n");
for(m=101;m<=200;m++)
{ k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{leap=0;break;}
if(leap) {printf("%-4d",m);h++;
if(h%10==0)
printf("/n");
}
leap=1;
}
printf("/nThe total is %d",h);
}
-----------------------------------------------------------------------------
【程式3】
題目:一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
1.程式分析:在10萬以內判斷,先將該數加上100後再開方,再將該數加上268後再開方,如果開方後
的結果滿足如下條件,即是結果。請看具體分析:

驗證一個數完全平方數不用sqrt:

利用恆等式: 1+3+5+7+....+(2*n-1)=n^2//等差數列前n項和公式

n*(a1+an)/2

bool isSqrt(int n)
{
for(int i=1;n>0;i+=2) n-=i;
return 0 == n;
}

2.程式原始碼:

(1)
#include "math.h"
void main()
{
long int i,x,y,z;
for (i=1;i<100000;i++)
{ x=sqrt(i+100); /*x為加上100後開方後的結果*/
y=sqrt(i+268); /*y為再加上168後開方後的結果*/
if(x*x==i+100&&y*y==i+268)/*如果一個數的平方根的平方等於該數,這說明此數是完全平方數*/
printf("/n%ld/n",i);
}
}

(2)

#include "stdio.h"

bool IsaFullSquare(int n)

{

for(int i=1;n>0;i=i+2)n-=i;

return n==0;

}

void main()

{

int n=1;

for(;n<10000;n++)

{

int num=n+100;

int n1=IsaFullSquare(num);

int n2=IsaFullSquare(num);

if(n1+n2==2)printf("the number is%d/n",n);

}

}
-----------------------------------------------------------------------------
【程式4】
題目:打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數 本身。例如:153是一個“水仙花數”,因為153=1的三次方+5的三次方+3的三次方。
1.程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位。[重點]分解各個位上的數
2.程式原始碼:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出個位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("/n");
}
-----------------------------------------------------------------------------

【程式5】
題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6=1+2+3.程式設計 找出1000以內的所有完數。
1. 程式分析:完數只是它的值等於它所有因子的和比如28=1+2+4+7+14;所以不要被誤導
2.程式原始碼:

#include

void main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i

{
if((j%i)==0)
{ n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;iprintf("%d,",k[i]);
printf("%d/n",k[n]);
}
}
}
-----------------------------------------------------------------------------
【程式6】
題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月 後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
1.程式分析:Fibonacci數列, 兔子的規律為數列1,1,2,3,5,8,13,21....
2.程式原始碼:long fn[20]={1,1};for(int i=3;i<-20;i++)fn[i]=fn[i-1]+fn[i-2];
#include

void main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("/n");/*控制輸出,每行四個*/
f1=f1+f2; /*前兩個月加起來賦值給第三個月*/
f2=f1+f2; /*前兩個月加起來賦值給第三個月*/
}
}

-----------------------------------------------------------------------------
【程式7】
題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。

程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數你n,
重複執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。

[注意]不需要先把質數求出來,因為分解的時候從2,3開始,開始的時候已經可以拆出來最小額質數的集合,只是從頭開始比較就可以了。

2.程式原始碼:
/* zheng int is divided yinshu*/
#include

void main()
{
int n,i;
printf("/nplease input a number:/n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
{
while(n!=i)
{
if(n%i==0)
{ printf("%d*",i);
n=n/i;
}
else
break;
}
}
printf("%d",n);}
-----------------------------------------------------------------------------
【程式8】
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
1.程式分析:利用輾除法。

輾轉相除法, 又名歐幾里德演算法(Euclidean algorithm)乃求兩個正整數之最大公因子的演算法。輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。

CODE

1

int m,n,a,b,temp;
    scanf("%d,%d",&m,&n);
    if(m>n)
    {
        temp=m;
        m=n;
        n=temp;
    }
    a=m;b=n;
//較大數作被除數a,較小數作除數b,a對b取餘,餘數作為除數,除數作為被除數,直到除數為零為止,最後一個被除數為公約數
while(b)
    {
        temp=a%b;
        a=b;
        b=temp;
    }
    printf("a greatest common denominator is: %d/n",a);
    printf("lowest common multiple is: %d/n",m*n/a);

-----------------------------------------------------------------------------

【程式9】
題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
1.程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去掉不滿足條件的排列。 (與第10題類似)都是在三個位置上填數並且要求符合一定條件
2.程式原始碼:
#include

void main()
{
int i,j,k;
printf("/n");
for(i=1;i<5;i++) /*以下為三重迴圈*/
for(j=1;j<5;j++)
for (k=1;k<5;k++)
{
if (i!=k&&i!=j&&j!=k) /*確保i、j、k三位互不相同*/
printf("%d,%d,%d/n",i,j,k);
}
}

-----------------------------------------------------------------------------

【程式10】
題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請程式設計序找出三隊賽手的名單。
1.程式分析:同第上一題,在各個職位上選擇人,並且加上限制條件
2.程式原始碼:
#include

void main()
{
char i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
{
if(i!=j)
for(k='x';k<='z';k++)
{ if(i!=k&&j!=k)
{ if(i!='x'&&k!='x'&&k!='z')
printf("order is a--%c/tb--%c/tc--%c/n",i,j,k);
}
}
}
}