//题目46:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只 //猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 //一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, //问海滩上原来最少有多少个桃子? #include<stdio.h> #include<stdlib.h> //分析:最少有多少个桃子,说明是满足条件的最小数;假设有X个桃子,第一个猴子的桃子数量是(X-1)/5, //第二只猴子的数量是(第一个猴子的桃子数量的4倍-1)/5 即(4*f(1)-1)/5=f(2)====> f(1)=(5*f(2)+1)/4 //f(n)=(5*f(n+1)+1)/4 int i = 0; int t = 0; int Peach(int n){ if (n == 5) { i++; return i; } else{ t = 5 * Peach(n + 1) + 1; do{ t = 5 * Peach(n + 1) + 1; } while (t % 4 != 0); //如果不是4的倍数 那么第n个猴子有的桃子数量不是整数, return t / 4; } } void main(){ printf("海滩上原来最少有%d个桃子 ", 5*Peach(1)+1); system("pause"); }
//题目47:尼科彻斯定理证明 //任何一个整数的立方都可以写成一串连续奇数的和 //思路:一串连续奇数,可以从1+3+...,当和>整数的立方的时候,可以减去第一个奇数1,继续判断和是否>整数的立方 //如果仍然大于整数的立方,再减去第二个奇数,一直继续直到和小于整数的立方时,末尾再加上 最后的奇数+2 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> #include<assert.h> void main(){ int tnum = 0; int num = 0; int tsun = 0; int index = 0; int k = 1; int i = 1; printf("请输入一个整数 "); scanf("%d", &tnum); //断言 assert(tnum != 0); num = tnum*tnum*tnum; while (1){ tsun += i; i += 2; if (i>num) { break; } //当和大于整数的立方时,进行减少奇数操作 if (tsun>num) { index = tsun; k = 1; //从1开始,不断减去前面的奇数 while (index > num){ index -= k; k = k + 2; } //如果结果不等于num,说明不是连续的奇数,需要在后面继续追加一个奇数 if (index != num) { continue; } else{ //打印结果 for (int m = k; m+2 <=i; m=m+2) { if (m+2>=i) { printf("%d", m); } else{ printf("%d+", m); } } break; } } //当和等于整数的立方时 else if (tsun==num) { //打印结果 for (int m = 1; m+2 <=i; m = m + 2) { if (m + 2 >= i) { printf("%d", m); } else{ printf("%d+", m); } } break; } } printf("=%d ",num); system("pause"); }
//题目48:父亲拿出2520个苹果,按照写在纸上的数量分给6个兄弟,每个人分到的苹果数量都不相同 //他说:老大,把你分到的苹果的1/8给老二,老二拿到后,连同原来的苹果分1/7给老三,老三拿到后, //连同原来的苹果分1/6给老四,以此类推,最后老六拿到后,连同原来的苹果分1/7给老大, //这样你们每个人分到的苹果数量就一样多了。求出原来各兄弟分得多少个苹果。 #include<stdio.h> #include<stdlib.h> //思路:从老二开始分析:老二没分苹果时苹果的数量 = 老大原有的苹果数量*(1/8) + 老二原有的苹果数量 //就老二比较特殊,后面的就比较规律 //老三没分苹果时苹果的数量 = 老二没分苹果时苹果的数量*(1/7) + 老三原有的苹果数量 //按照此规律,最后6个人苹果的数量相等 都是420个 //那么 老二没分苹果时苹果的数量*(6/7) = 420,由此可以求出 老二到老六没分苹果时苹果的数量 //老大的最终苹果数量420 = 老六没分苹果时苹果的数量*(1/3) + 老大原有的苹果数量*(7/8) //由此可以求出老大原有的苹果数量,进而可以求出老二原有的苹果数量 void main(){ //x[6]表示原来的苹果,y[6]表示拿到苹果不分给其他人的苹果数量 int x[6] = { 0 }, y[6] = {0}; //根据分析 老二拿到的苹果(不分给老三)=老大以前的苹果*(1/8)+老二原来的苹果 //即;老二原来的苹果=老二拿到的苹果(不分给老三)-老大以前的苹果*(1/8) for (int i = 1; i < 6; i++) { y[i] = 420 * (8 - i) / (7 - i); } //获取老大原来的苹果数 //420=老六苹果数(不分给别人)*1/3+老大原来苹果数(7/8) //老大原来苹果数=(420-老六苹果数(不分给别人)*1/3)*8/7 //y[0]=x[0]的解释 老大拿到苹果不分给其他人的苹果数量 就是老大原来的苹果数量 y[0]=x[0] = (420 - y[5] * 1 / 3) * 8 / 7; for (int i = 1; i < 6; i++) { //y[i - 1] / (9-i) 把老二没分苹果的数量*(1/7)+老三原有的数量 ==老三现在没分苹果的数量 //老三原有的数量==老三现在没分苹果的数量 - 老二没分苹果的数量*(1/7) x[i] = y[i] - y[i - 1] / (9-i); } int sun = 0; for (int i = 0; i < 6; i++) { sun += x[i]; printf("第%d个兄弟的原来的苹果数量%d ",i+1,x[i]); } printf("总数量是%d ",sun); system("pause"); }