5.2細菌繁殖


問題は、細菌の繁殖速度が毎日倍増していることを示している.例えば、1日目は10個、2日目は20個、3日目は40個、4日目は80個….最初の日の日付と細菌の数を与えて、ある日まで細菌の数を求めるプログラムを書いてください.入力データの最初の行には、テストデータの数を表す整数nがある.その後、n行の各行には5つの整数があり、整数間は1つのスペースで区切られている.1番目の数は1日目の月、2番目の数は1日目の日付、3番目の数は1日目の細菌の数、4番目の数は要求された日の月、5番目の数は要求された日の日付を表します.初日と要求日が同じ年で、その年が閏年ではないことが知られており、要求日は必ず初日の後になります.データは、要求される1日の細菌の数が整数の範囲内であることを保証する.出力要求は、各試験データのセットについて、要求された1日の細菌数の整数を含む行を出力する.入力サンプル2 1 1 1 1 2 28 10 3 2出力サンプル2 40解題構想この問題は実際には与えられた2日間の間隔の日数nを求め、初日の細菌数に2を乗じたn次が問題の答えである.毎月の日数は不規則なため、プログラムでルールで記述するのは面倒なので、1つの配列を使用して毎月の日数を保存できます.計算プロセス全体は、試験サンプル数nを読み込む.n回やる:1.2つの日付と初日の細菌数を読み込む.  2.2つの日付をその年の数日目に変換します.3.2つの日数の差、すなわち、それらの中間間隔の日数mを得る.4.1日目の細菌数に2のmを乗じてxまで待つ.  5.出力x; 
コードは次のとおりです.
/*
*
*Declaration:The author of <<Accelerated C++>> has wrote in the end of that book: As you look for reading materimal, keep in mind that books on the shelf do not make you a better programmer. Ultimately, the only way to improve your programming is to write programs.	>        ACM  ,          ,         。    ,     ,       。
*
*    :mingxinglai#gmail.com
*
*/

#include <stdio.h>

int main(int argc, char* argv[])
{
	int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int n;
	scanf("%d", &n);

	for( int i = 0; i < n; i++)
	{
		int month_1, day_1, month_2, day_2, num;
		scanf("%d%d%d%d%d", &month_1, &day_1, &num, &month_2, &day_2);
		int sum = 0;
		for( int k = month_1; k < month_2; k++)
			sum += days[ k - 1 ];

		sum -= day_1;
		sum += day_2;

		int  nNum = num;
		for(int  k = 0; k < sum; k++)
			nNum *= 2;

		printf("%d
", nNum); } return 0; }

例2:(上のコードより簡潔明瞭)
#include <stdio.h>
int month[]= {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(int argc, char* argv[])
{
	int times;
	scanf("%d", ×);
	int mon1, date1, mon2, date2, num;
	while( times-- )
	{
		scanf("%d%d%d%d%d", &mon1, &date1, &num, &mon2, &date2);
		int days = date2 - date1;
		for( int i = mon1; i < mon2; i++)
			days += month[i];

		long nNum = num;
		for( int j = 0; j < days; j++)
			num *= 2;

		printf("%d
", num); } return 0; }