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