1.連續整數固定和問題
題目要求:編寫一個程序,找出一個數的全部的連續整數固定和。所謂一個數n的連續整數固定和,就是指存在a1,a2,...an,其中,ai+1比ai大1,使得a1+a2+...+an=n。這樣,a1,a2,...,an稱爲n的一個連續整數固定和。例如27的全部的連續整數固定和有3組:2+3+...+7=27;8+9+10=27;13+14=27。本題就是要找出任意輸入的整數n的全部的連續整數固定和。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void cntnsIntSum(int num)//連續整數固定和判斷
{
int i,j,sum=0;
for(i=1;i<num;i++)
{
j=i;
while(sum<num)
{
sum=sum+j;
j++;
}
if(sum==num)
printf("%d+...%d=%d ",i,j-1,num);
sum=0;//每次循環結束都需要重新初始化sum
}
}
main()
{
int num;
printf("Please input a number:/n");
scanf("%d",&num);
printf("it can change to:/n");
cntnsIntSum(num);
}
2.表示成兩個數的平方和
題目要求:已知一個正整數N,編寫一個程序,找出所有滿足X*X+Y*Y=N的正整數對X和Y。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void getXY(int num)
{
int i,j;
for(i=1;i<=sqrt(num);i++)
for(j=i;j<=sqrt(num);j++)
{
if(i*i+j*j==num)
printf("%d*%d+%d*%d=%d ",i,i,j,j,num);
}
}
main()
{
int num;
printf("Please input a number:/n");
scanf("%d",&num);
printf("it can change to:/n");
getXY(num);
}
3.具有特殊性質的數
題目要求:有這樣一個4位數abcd,它具有這樣的性質abcd=(ab+cd)*(ab+cd)。其中,ab和cd爲兩個2位數,求這個4位數abcd。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void func()
{
int a,b,c,d;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
for(d=0;d<=9;d++)
{
if(1000*a+100*b+10*c+d==((10*a+b)+(10*c+d))*((10*a+b)+(10*c+d)))
printf("%d%d%d%d ",a,b,c,d);
}
}
main()
{
printf("There are following numbers according with the condition:/n");
func();
}
4.驗證角谷猜想
題目要求:角谷猜想的內容爲:任意給定一個自然數,若它爲偶數則除以2,若它爲奇數則乘以3加1,得到一個新的自然數,按照這樣的計算方法計算下去,若干次後得到的結果必然爲1.編寫程序對角谷猜想的正確性加以驗證。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void func(int n)
{
int count;
while(n!=1 && count<=1000)
{
if(n%2==0)
{
printf("%d/2=",n);
n=n/2;
printf("%d/n",n);
}
else if(n%2==1)
{
printf("%d*3+1=",n);
n=n*3+1;
printf("%d/n",n);
}
count++;
if(n==1 && count<=1000)
printf("This natural number is according to JiaoGu Guess/n");
}
}
main()
{
int n;
printf("Please input a number to vertify:/n");
scanf("%d",&n);
printf("-------step of vertification-------/n");
func(n);
}
5.驗證四方定理
題目要求:四方定理是數論中的重要定理,它可以敘述爲:所有自然數最多隻要4個數的平方和就可以表示了,編寫一個程序驗證四方定理。
題目分析:由於四方定理已是被證明了的數論定理,因此所謂驗證四方定理,實質上就是要把任意輸入的一個自然數表示爲至多4個數的平方和的形式。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int mode1(int n)
{
if((int)sqrt(n)*(int)sqrt(n)==n)
{
printf("%d*%d=%d/n",(int)sqrt(n),(int)sqrt(n),n);
return 1;
}
else
return 0;
}
int mode2(int n)
{
int a,b;
for(a=1;a<=sqrt(n);a++)
for(b=a;b<=sqrt(n);b++)
{
if(a*a+b*b==n)
{
printf("%d*%d+%d*%d=%d/n",a,a,b,b,n);
return 1;
}
}
return 0;
}
int mode3(int n)
{
int a,b,c;
for(a=1;a<=sqrt(n);a++)
for(b=a;b<=sqrt(n);b++)
for(c=b;c<=sqrt(n);c++)
{
if(a*a+b*b+c*c==n)
{
printf("%d*%d+%d*%d+%d*%d=%d",a,a,b,b,c,c,n);
return 1;
}
}
return 0;
}
int mode4(int n)
{
int a,b,c,d;
for(a=1;a<=sqrt(n);a++)
for(b=a;b<=sqrt(n);b++)
for(c=b;c<=sqrt(n);c++)
for(d=c;d<=sqrt(n);d++)
{
if(a*a+b*b+c*c+d*d==n)
{
printf("%d*%d+%d*%d+%d*%d+%d*%d=%d",a,a,b,b,c,c,d,d,n);
return 1;
}
}
return 0;
}
void proveFourSequence(int n)
{
if(mode1(n))
printf("/nIt has verified one squares");
else if(mode2(n))
printf("/nit has verified two squares");
else if(mode3(n))
printf("/nIt has verified three squares");
else if(mode4(n))
printf("/nIt has verified four squares");
}
main()
{
int n;
printf("Please input a number to vertify:/n");
scanf("%d",&n);
printf("-------step of vertification-------/n");
proveFourSequence(n);
printf("/n");
}
6.遞歸法尋找最小數
題目要求:編寫一個程序,要求從一個整數序列中找出最小的元素,並用遞歸的方法實現。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int getMin(int array[],int n)
{
int val1,val2,val3;
if(n==1)
return array[0];
if(n%2==0)
{
val1=getMin(array,n/2);
val2=getMin(array+n/2,n/2);
if(val1>val2)
return val2;
else
return val1;
}
if(n%2==1)
{
val1=getMin(array,n/2);
val2=getMin(array+n/2+1,n/2);
val3=array[n/2];
if(val1<val2)
{
if(val1>val3)
return val3;
else
return val1;
}
else if(val1>val2)
{
if(val2>val3)
return val3;
else
return val2;
}
}
}
main()
{
int array[9]={2,13,23,56,8,23,11,23,111};
printf("The minum element of this array is %d/n",getMin(array,9));
}
7.尋找同構數
題目要求:正整數n若是它的平方數的尾部,則稱n爲同構數。例如,6是其平方數36的尾數,76是其平方數5776的尾數,因此6和76都是同構數,編寫一個程序,找出1000以內的同構數。
題目分析:如果一個數i是同構數,則i滿足性質:i^2的尾數等於i。
要判斷一個正整數i是否是同構數,首先要判斷i的位數,即判斷i是個位數,還是十位數,還是百位數...。
如果i是個位數,則i^2的尾數可通過i^2%10來獲得。只要判斷i^2%10是否等於i就可以判斷i是否是同構數。如果i^2%10等於i,則i是同構數,否則i不是同構數。
如果i是十位數,則i^2的尾數可通過i^2%100來獲得。只要判斷i^2%100是否等於i就可以判斷i是否是同構數。如果i^2%100等於i,則i是同構數,否則i不是同構數。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int func(int i)
{
int j;
for(j=10;j<=1000;j=j*10)
{
if(i/j==0)
break;/*獲得n的位數*/
}
if((i*i)%j==i)
return 1;
else
return 0;
}
void gettonggou()
{
int i;
for(i=1;i<=1000;i++)
{
if(func(i))
printf("%d ",i);
}
}
main()
{
printf("The Tonggoushu bellow 1000 are:/n");
gettonggou();
printf("/n");
}
8.驗證尼科徹斯定理
題目要求:尼科徹斯定理可以敘述爲:任何一個整數的立方和都可以表示成一串連續奇數的和。這裏要注意,這些奇數一定是連續的,例如1、3、5、7、9...
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void Nicoqish(int n)
{
int sum=0,i,j;
for(i=1;i<n*n*n;i=i+2)
for(j=i;j<=n*n*n;j=j+2)
{
sum+=j;
if(n*n*n==sum)
{
printf("%d……%d/n",i,j);
return;
}
if(sum>n*n*n)
{
sum=0;
break;
}
}
}
main()
{
int num;
printf("Please input a number:/n");
scanf("%d",&num);
printf("Nicoqish is:");
Nicoqish(num);
}
9.三重回文數字
題目要求:找出11-999之間的所有的三重回文數字。所謂三重回文數字a就是指a、a^2、a^3都是迴文數字。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
long reverse(long i)/*求i的倒置數*/
{
long m,j=0;
m=i;
while(m)
{
j=j*10+m%10;
m=m/10;
}
return j;
}
long isCircle(long n)/*判斷n是否是迴文數*/
{
if(n==reverse(n))
return 1;
else
return 0;
}
void palindrome(int begin,int end)
{
int i;
for(i=begin;i<=end;i++)
if(isCircle(i) && isCircle(i*i) && isCircle(i*i*i))
printf("%d ",i);
printf("/n");
}
main()
{
printf("The palindrome numbers between 11-999 are:/n");
palindrome(11,999);
}
10.馬克思手稿中的數學題
題目要求:偉大的思想家馬克思的手稿中有這樣一道有趣的數學題:有30個人,其中有男人、女人和孩子。他們在一家飯館中喫飯,共花費50先令。如果每個男人喫飯要花3先令,每個女人要花2先令,每個小孩要花1先令,問男人、女人、小孩各多少人?
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void Marix()
{
int i,j,k;
for(i=1;i<=30;i++)
for(j=1;j<=30;j++)
for(k=1;k<=30;k++)
{
if(i+j+k==30 && 3*i+2*j+k==50)
printf("%d %d %d/n",i,j,k);
}
}
main()
{
printf("The solution of Marix's topic is:/n");
printf("Men Woman Children/n");
Marix();
}
11.漁夫捕魚問題
題目要求:A、B、C、D、E五個漁夫夜間合作捕魚,凌晨時都疲憊不堪,各自在河邊的樹叢中找地方睡覺了。待日上三竿,漁夫A第一個醒來,他將魚分作5份,把多餘的一條扔回河中,拿自己的一份回家去了。漁夫B第二個醒來,也將魚分作5份,扔掉多餘的一條,拿走自己的一份,接着C、D、E依次醒來,也都按同樣的辦法分魚,問5個漁夫至少合夥捕了多少條魚?試編程序算出。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int getfish(int init,int n)
{
int s=init;
while(n)
{
s=s*5+1;
n--;
}
return s;
}
main()
{
printf("Fish which were gotten by fishers at least are %d/n",getfish(6,4));
}
12.尋找假幣
題目要求:一個國王要賞賜給一個大臣30枚金幣,但是其中有一枚是假幣。國王提出要求:只能用一個天平作爲測量工具,並用儘量少的比較次數找出這枚假幣,那麼餘下的29枚金幣就賞賜給這個大臣,否則這個大臣將得不到賞賜。已知假幣要比金幣的分量略輕一些。聰明的大臣思考片刻,很快用天平找出了這枚假幣,於是得到了剩下的29枚金幣。你知道這位大臣是如何找到假幣的嗎?請編寫一個程序模擬找假幣的過程,注意用盡量少的比較次數找出這枚假幣。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int getFailseCoin(int coin[],int low,int high)
{
int i,sum1=0,sum2=0,sum3=0;
if(low+1==high)
{
if(coin[low]<coin[high])
return low+1;
else
return high+1;
}
if((high-low+1)%2!=0)//數字個數爲奇數個
{
for(i=low;i<=low+(high-low)/2-1;i++)/*前半段和*/
sum1+=coin[i];
for(i=low+(high-low)/2+1;i<=high;i++)/*後半段和*/
sum2+=coin[i];
sum3=coin[low+(high-low)/2];
if(sum1>sum2)
return getFailseCoin(coin,low+(high-low)/2+1,high);
else if(sum1<sum2)
return getFailseCoin(coin,low,low+(high-low)/2-1);
if(sum1+sum3==sum2+sum3)
return low+(high-low)/2+1;
}
if((high-low+1)%2==0)//數字個數爲偶數個
{
for(i=low;i<=low+(high-low)/2;i++)/*前半段和*/
sum1+=coin[i];
for(i=low+(high-low)/2+1;i<=high;i++)/*後半段和*/
sum2+=coin[i];
if(sum1>sum2)
return getFailseCoin(coin,low+(high-low)/2+1,high);
else if(sum1<sum2)
return getFailseCoin(coin,low,low+(high-low)/2);
}
}
main()
{
int coin[30]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2};
printf("The %dth coin is false/n",getFailseCoin(coin,0,29));
}
13.計算組合數
題目要求:編寫一個程序,計算組合數Cnm。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int jiecheng(int m)
{
int i,sum=1;
for(i=1;i<=m;i++)
sum=sum*i;
return sum;
}
int zuhe(int m,int n)
{
int jiecheng_m,jiecheng_n,jiecheng_mn;
jiecheng_m=jiecheng(m);
jiecheng_n=jiecheng(n);
jiecheng_mn=jiecheng(m-n);
return jiecheng_m/(jiecheng_n*jiecheng_mn);
}
main()
{
int m,n;
printf("Please input two numbers m and n:/n");
scanf("%d,%d",&m,&n);
printf("m and n zuhe is %d/n",zuhe(m,n));
}
14.遞歸法求冪
題目要求:編寫一個遞歸的算法,計算m^n。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
long myPow(long m,long n)
{
int tmp=0;
if(n==0)
return 1;
if(n==1)
return m;
if(n%2==0)
{
tmp=myPow(m,n/2);
return tmp*tmp;
}
if(n%2==1)
return m*myPow(m,n-1);
}
main()
{
int m,n;
printf("Please input two numbers m and n:/n");
scanf("%d,%d",&m,&n);
printf("the result of pow(%d,%d) is %ld/n",m,n,myPow(m,n));
}
15.選美比賽
題目要求:在選美比賽的現場,有一批選手參加比賽,比賽的規則是最後得分越高,名次越低。當比賽結束時,要在現場按照選手的出場順序(即選手的序號)宣佈最後得分和最後名次。獲得相同分數的選手具有相同的名次,名次序號連續,不用考慮同名次的選手的人數。例如:
選手符號位: 1,2,3,4,5,6,7
選手得分爲: 5,3,4,7,3,5,6
則輸出名次爲:3,1,2,5,1,3,4
請編程幫助大賽組委會完成比賽的評分和排名工作。
題目分析:應用結構體將每個選手的信息(包括序號、得分、名次)存放在一個結構體變量中,然後組成一個結構體數組。
最開始每個結構體變量中只存放選手的序號和得分信息,然後以選手的得分爲比較對象,從小到大進行排序。這裏應用冒泡排序法對含有n個元素的結構體數組psn中的元素按照score從小到大的順序進行排序。排序後的數組psn按照score的值從小到大排序。
然後指定每一位選手的名次。因爲此時結構體數組psn已按照score從小到大排序,因此就比較容易設定每一位選手的名次了。首先給第一位選手psn[0]的名次設定爲1,因爲他的得分是最少的。然後依次給psn[1]-psn[n-1]設定名次。如果psn[i].score不等於psn[i-1].score,說明psn[i]的名次要落後一名,否則psn[i]的名次與psn[i-1]的名次相同。
最後在按照選手的序號重新排序,以便能夠按照選手的序號輸出結果。
程序代碼:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct player
{
int num;
int score;
int rand;
};
void sortSore(struct player psn[],int n)
{
int i,j;
struct player temp;
for(i=0;i<n-1;i++)//使用冒泡法對選手的成績進行排序
for(j=0;j<n-1-i;j++)
{
if(psn[j].score>psn[j+1].score)
{
temp=psn[j];
psn[j]=psn[j+1];
psn[j+1]=temp;
}
}
}
void setRand(struct player psn[],int n)//對每個選手排序
{
int i,j=2;
psn[0].rand=1;
for(i=1;i<n;i++)
{
if(psn[i].score!=psn[i-1].score)
{
psn[i].rand=j;
j++;
}
else
psn[i].rand=psn[i-1].rand;
}
}
void sortNum(struct player psn[],int n)
{
int i,j;
struct player temp;
for(i=0;i<n-1;i++)//使用冒泡法對選手的成績進行排序
for(j=0;j<n-1-i;j++)
{
if(psn[j].num>psn[j+1].num)
{
temp=psn[j];
psn[j]=psn[j+1];
psn[j+1]=temp;
}
}
}
void sortRand(struct player psn[],int n)
{
sortSore(psn,7);
setRand(psn,7);
sortNum(psn,7);
}
main()
{
int i;
struct player psn[7]={{1,5,0},{2,3,0},{3,4,0},{4,7,0},{5,3,0},{6,5,0},{7,6,0}};
printf("num score rand/n");
sortRand(psn,7);
for(i=0;i<7;i++)
printf("%d/t%d/t%d/n",psn[i].num,psn[i].score,psn[i].rand);
}