數學趣題二

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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章