数学趣题二

    技术2025-07-07  14

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

     

    最新回复(0)