数学趣题二

来源:互联网 发布:linux oracle 新建实例 编辑:程序博客网 时间:2024/04/29 12:19

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

 

原创粉丝点击