藍兔子編程
判斷error的情況有問題。其實這題列出公式就可以解答了:
設x只鴿子,已知兔子,則:
x+y=n;
2x+4y=m;
解得:x=2n-m/2,y=m/2-n。
因為x,y都是非負整數,所以 m/2 必須是一個整數,也就是m必須是偶數。同時:
x=2n-m/2>=0,解得4n>=m;
y=m/2-n>=0,解得m>=2n;
因此 2n<=m<=4n,且m是偶數。這就是判斷是否「Error」的條件。
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned int n,m;
while(scanf("%d%d",&n,&m)&&!(m==0&&n==0))
{
if(m%2!=0 || m<2*n || m>4*n)
printf("Error\n");
else
printf("%d %d\n",(2*n-m/2),(m/2-n));
}
return 0;
}
B. 兔子繁殖問題 C語言編程
根據題意,得出以下結果:
年份:0 0.5 1 1.5 2 2.5 3 3.5 4 ...
兔子:1 1 2 3 5 8 13 21 34...
序號: 0 1 2 3 4 5 6 7 8...
所以發現規律:除前兩個外,後面的則是等於前兩個的種即:A0=1,A2=1,An=A(n-1)+A(n-2)
這樣程序就可以開始編制了
#include "stdio.h"
main()
{
int year,total,i,a1,a2;
printf("\n請輸入多少年後:");
scanf("%d",&year);
a1=1;
a2=1;
for(i=2;i<2*year;i++)
{
if(i%2==1)
{
a1=a1+a2;
total=a1;
}else{
a2=a1+a2;
total=a2;
}
}
printf("\n第%d年末總共會有%d對兔子",year,total);
}
C. C語言編程:兔子繁殖問題
如圖,此題難度較大,要用到隊列(我優化為循環隊列)
#include<stdio.h>
#defineLIFETIME13 //兔子壽命,單位半年(年齡小於此!)
#defineINITNUM1 //初始兔子有多少對
main()
{
inthY=0; //兔子歷(就是時刻表):單位:半年
intnum[LIFETIME]={INITNUM,0}; //存儲不同年齡兔子的對數(初始為0歲1對)
//babyI下標代表0歲,往前年齡增大,越過數組下界跳到上界,所以babyI+1反而是最老兔子
intbabyI=0; //0歲兔子對應下標,年齡單位為半年
intloveNum=0; //可生育兔子數量
inttotalNum=INITNUM; //總計兔子數量
intage1I=LIFETIME-2; //1歲兔子對應下標(開始能生育)
intage5_5I=LIFETIME-11; //1歲、5.5歲兔子對應下標(剛好能生育、剛好不能生育年齡)
intn=30; //輸入n半年後!
while(hY<=n){
inti,j; //遍歷臨時變數。①展示兔子數量。
printf("第%.1f年 總計:%d對 可生育:%d對
",(float)hY/2,totalNum,loveNum);
/*
for(i=0;i<LIFETIME;i++){
printf("%.1f歲 ",(float)i/2); //列印表頭
//printf("%d,%.1f歲 ",i,(float)(++i)/2); //列印表頭
}printf("單位:對
"); //換行*/
i=babyI; //顯示各年齡對應數量
j=0;
do{
//printf("%d ",num[i]);
if(hY<21){ //僅用於加 顯示
if((++j)%2==0)printf(" ");}
printf("%d",num[i]);
if(i>0)i--; //下標循環往左移動
elsei=LIFETIME-1;
}while(i!=babyI);
printf("
"); //換行
//②半年後
hY++; //時間過去半年
age1I=(age1I+1)%LIFETIME; //1歲數量(對)對應下標
age5_5I=(age5_5I+1)%LIFETIME;//5.5歲數量(對)對應下標
//printf("%d,%d
",age1I,age5_5I);
loveNum+=num[age1I]-num[age5_5I]; //可生育兔子數量(對)
babyI=(babyI+1)%LIFETIME; //新babyI設為原最老兔子的下標,
totalNum+=loveNum-num[babyI]; //每對大兔子可以生一對小兔子-死亡的老兔
num[babyI]=loveNum; //老兔的位置換成新兔
}
}
D. 求unit4 兔子繁殖 編程c++
#include<iostream>
using namespace std;
int main(){
int n;
long long sum = 0;
long long age[12] = {0};
age[0] = 1;//age[0]為剛出生,age[i]為i個月大的兔子
cout << "Enter n:" << endl;
cin >> n;
for (int i = 2; i <= n; i++)
{//當前為第i個月初,目前數組中的數據為第i-1個月初,現在進行處理
long long birth = 0;
for (int j = 1; j < 12; j++)//上月1~11個月大的兔子,在這個月變為2~12個月大,都會生小兔子
birth += age[j];
for (int j = 11; j >= 1; j--)//上月j-1個月大的這個月長為j個月大,上月 11月大小的這個月生完小兔子就死亡
age[j] = age[j-1];
age[0] = birth;
}
for (int i = 0; i < 12; i++)
sum += age[i];
cout << "total: " << sum%100000007 << endl;
}
看到你之前還有個問題,剛剛學編程?可以相互學習交流
E. c語言編程,求兔子問題。
因為只有6年,定義一個數組存儲第n年各歲兔子的數量
#include<stdio.h>
int sum(int n)
{
int i,j,a[6];
a[0]=1; //初始化,第一年只有1對,都是1歲
for(i=1; i < 6; i++)
a[i] = 0; //初始化,第一年只有1對,其餘為0
for(i=1; i < n; i++)
{//第n年x歲的兔子數是第n-1年x-1歲兔子的數量
// a[x] a[x-1]
for(j=5;j>0;j--)
a[j] = a[j-1];//7歲的就會死掉,直接丟棄
//到3歲就可以生一對,所以從3(數組從0開始,故這里是2)加到6
a[0] = a[2] + a[3] + a[4] + a[5];
}
return (a[0] + a[1] + a[2] + a[3] + a[4] + a[5]);
}
void main()
{
int i=1;
for(i=1; i < 25; i++)
{
printf("%-3d", i);
printf(":%5d\n", sum(i));
}
}
F. Java代碼編程 經典的兔子問題
這是斐波那契數列的問題
可以用遞歸,也可以用循環
遞歸:
public class Demo3 {
// 使用遞歸方法
private static int getFibo(int i) {
if (i == 1 || i == 2)
return 1;
else
return getFibo(i - 1) + getFibo(i - 2);
}
public static void main(String[] args) {
System.out.println("斐波那契數列的前20項為:");
for (int j = 1; j <= 20; j++) {
System.out.print(getFibo(j) + "\t");
if (j % 5 == 0)
System.out.println();
}
}
}
循環:
public class Demo2 {
// 定義數組方法
public static void main(String[] args) {
int arr[] = new int[20];
arr[0] = arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
System.out.println("斐波那契數列的前20項如下所示:");
for (int i = 0; i < arr.length; i++) {
if (i % 5 == 0)
System.out.println();
System.out.print(arr[i] + "\t");
}
}
}
G. c語言編程:求兔子問題。
不知道我理解錯沒 兔子夫妻 在第六年 先生下一對 然後雙雙死亡
#include<stdio.h>
int fun(int n)
{
int sum;
for(int i=0;i<=n;i++)
{
if(i==7)sum=sum-1;
//到了第七年 開始的一對死掉了 不能再生了
if(i>=9)sum=sum-(fun(i-6)-fun(i-7));
//到了第九年 又開始死了
if(i<3)sum=1;
//前二年只有一對
if(i>=3)sum*=2;
//二年後每年兔子都會翻倍
}
return sum;
}
void main()
{
int n;
for(;;){
printf("請輸入年數:");
scanf("%d",&n);
printf("有兔子:%d對\n",fun(n));
}
}
H. 緊急!電腦編程高手請進!C#編程:兔子繁殖問題
樓主 晚上睡不著 於是給你用三種方法解答 嘿嘿 不要浪費哦
public class Program
{
static void Main(string[] args)
{
Console.Write("請輸入月數:");
string buffer = Console.ReadLine();
int Months = Convert.ToInt32(buffer); //結束月數
CalculateByObjectOriented(Months);
CalculateByRecursion(Months);
CalculateByMathematics(Months);
}
public static void CalculateByObjectOriented(int MonthCount) //面向對象方法實現
{
Console.Write("使用面向對象方法實現,總兔子數:{0}\n" , new RearRing(MonthCount).GetRabbitTotal());
}
public static void CalculateByMathematics(int MonthCount)
{
//能力有限,抽象不出表達式,偷懶一下
//畫一個節點圖,你就能清楚地看出為什麼了
int Period = 3; //出生後第幾個月能生小兔
int val1 = 0;
int val2 = 0;
int val3 = 1;
int RubbitsCount = 2;
if (MonthCount > 3)
{
RubbitsCount += val3 * 2;
for (int i = Period + 1; i < MonthCount + 1; i++)
{
val1 = val2;
val2 = val3;
val3 = val2 + val1;
RubbitsCount += val3 * 2;
}
}
Console.Write("使用數學方法實現,總兔子數:{0}\n", RubbitsCount);
}
public static void CalculateByRecursion(int MonthCount) //遞歸實現
{
Console.Write("使用遞歸實現,總兔子數:{0}\n" , GetFinalNum(0,MonthCount,0));
}
private static int GetFinalNum(int StartMonth, int MonthCount,int Level) //遞歸調用
{
int FinalNum=2;
int Period = 3; //出生後第幾個月能生小兔
for (int i = StartMonth; i < MonthCount; i++)
{
if (i - StartMonth >= Period-1)
{
FinalNum += GetFinalNum(i, MonthCount, Level + 1);
}
}
//For Debug
//Console.Write("當前級數:{0},共有兔子:{1}\n", Level, FinalNum);
return FinalNum;
}
}
public class RearRing
{
public IList<Rabbits> rabbitsList = new List<Rabbits>();
public RearRing(int MonthCount)
{
rabbitsList.Add(new Rabbits(this));
for (int i = 1; i < MonthCount; i++)
{
int count = rabbitsList.Count; //獲取當前兔子數
for(int j=0;j<count;j++)
rabbitsList[j].Grow();
}
}
public int GetRabbitTotal()
{
return Rabbits.RabbitNum;
}
public void Add()
{
Rabbits newRabbits = new Rabbits(this);
rabbitsList.Add(newRabbits);
}
}
public class Rabbits
{
public static int RabbitNum = 0; //兔子總數
private const int BornRabbitNum = 2; //每次出生多少只
private const int Period = 3; //出生後第幾個月能生小兔
private int Birthdate = 1; //題目不大明確,剛出生算幾個月大?在此假定剛出生1個月大,也就是說,"第三個月開始"表示兩輪後
RearRing _rearRing;
public Rabbits(RearRing RearRing)
{
this._rearRing = RearRing;
RabbitNum += BornRabbitNum;
}
public void Grow()
{
Birthdate+=1;
if (Birthdate >= Period)
Bear();
}
private void Bear()
{
_rearRing.Add();
}
}
I. 生兔子的經典編程演算法
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔都不死,那麼一年以後可以繁殖多少對兔子?
1 1月
1 2月
2 3月
3 4月
5 5月
8 6月
13 7月
21 8月
34 9月
55 10月
89 11月
144 12月
233 13月
第1種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
b = x & "," & y
For n = 3 To 13 Step 1
i = x + y
x = y
y = i
b = b & "," & i
Next
Print b
End Sub
這個演算法是最經典的。其實a月的數量也就是老兔子加上新生兔子。老兔子這么算的:因為當月的生產數量為上個月的兔子總數,而這個生產數量就是由老兔子生的。所以老兔子的數量就是a-1月的數量也就是上一個月的數量。新兔子這么算的:因為新兔子就是上一個月的繁殖數量,即a-1月的繁殖數量,而這個繁殖數量就是由a-2月的總數決定的,所以新兔子就是a-2月了。所以根據這個原理,第一種方法成立。
第2種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x & "," & y & "," & z
For n = 4 To 13 Step 1
i = y * 2 + x
x = y
y = z
z = i
b = b & "," & i
Next
Print b
End Sub
第2種演算法的邏輯是:
(a月-2的月總數)* 2 + (a月-3月總數)
因為當月的生產數量為上個月的兔子總數,而當月的新兔子(即上個月新生的兔子,這個月還未能生產)數量為上上個月的總數。
第3種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x & "," & y & "," & z
For n = 4 To 13 Step 1
i = z * 2 - x
x = y
y = z
z = i
b = b & "," & i
Next
Print b
End Sub
(a月總數*2) - (a-2月總數)
這第2種演算法和第3種演算法是基於第一種演算法的原理的。只不過實在太復雜了,我自己腦子里只能粗略整理它的邏輯關系(其實也不是很懂),所以寫出來大家一定看不懂。。。
後記:這個經典的兔子數列其實還可以繼續玩下去。有非常復雜的遞推關系(自己說的,雖然沒學過什麼叫真正的遞推不過應該差不多吧)。每個參數影響非常復雜。我本來想繼續這個混亂的遞推邏輯,但想到再復雜的演算法的時候我差不多都要瘋掉了。。啊啊啊,暫時就這樣吧~~~大腦休息下。熄火。