0724

 1.将任一整数转换为二进制形式。

将十进制整数转换为二进制形式的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算机内部就是以二进制形式存储的,所以没有必要再将一个整数经过一-系列的运算转化为二进制形式,只要将整数在内存中的二进制表示输出即可。

#include<stdio.h>
main()
{
	int x;
	printf("Input number:");
	scanf("%d",&x);
	printf("The answer:");
	print(x,sizeof(int)*8);
	putchar('\n');
}

print(x,n)
	int x,n;
{
	if(n>0)
	{
		putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));
		print(x,n-1);
	}
}

2.中国有句俗语“三天打魚两天晒网”。某人从1990年1月1日起升始“三天打角两天晒网”.同这个人在以后的某一天中是在“打魚”,逐是在“晒网”.
  根据题意可以将解题过程分内三歩
  1.计算从1990年1月1日开始至指定日期一共有多少天;
  2.由于“打鱼”和“晒网"的周期为5天,所以将汁算出的天数用5去除;
 3.根据余数判断他是在“打魚”,还是在“晒网”:

#include <stdio.h>

struct date
{
	int year;
	int month;
	int day;
}
main()
{
	struct date today,term;
	int yearday,year,day;
	printf("Enter year/month/day:");
	scanf("%d%d%d",&today.year,&today.month,&today.day);
	term.month = 12;
	term.day = 31;
	for(yearday = 0,year = 1990; year < today.year;year++)
	{
		term.year = year;
		yearday += days(term);
	}
	yearday += days(today);
	day = yearday % 5;
	if(day > 0 && day < 4)
	{
		printf("He was fishing at that day.\n");
	}
	else
	{
		printf("He was sleeping at that day.\n");
	}

}
int days(struct date day)
{
static int day_tab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int i,lp;
lp = day.year % 4 == 0 && day.year%100 !=0 || day.year % 400 == 0;
for (i = 1;i < day.month;i++)
{
	day.day += day_tab[lp][i];
}
	return day.day;
}

3. 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。
  按照题目的要求造出一个前两位数相同、后两位数相同且相互间又不同的整数,然后判断该整数是否是另一个整数的平方。

#include<stdio.h>
#include<math.h>

int main()
{
	int i,j,k,c;
	for(i = 1; i <= 9; i++)
	{
		for(j = 0; j <= 9; j++)
		{
			if(i != j)
			{
				k = i*1000+i*100+j*10+j;
				for(c = 31; c*c < k; c++);
				if(c*c == k)
				{
					printf("%d\n",k);
				}
			}
		}
	}
	return 0;
}

4.  假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的五年中每年的年底取出1000元到第五年时刚好取完,请算出他存钱时应存入多少。
  分析存钱和取钱的过程,可以采用倒推的方法.若第五年年底连本带息要取1000元,则要先求出第五年年初银行存款的钱数:
  第五年年初存款=1000/(1+12*0.0063)
  依次类推可以求出第四年、第三年..的年初银行存款的钱数:
 第四年年初存款= (第五年年初存款+ 1000)/(1 +12* 0.0063)
第三年年初存款= (第四年年初存款+ 1000)/(1+12 * 0.0063)
第二年年初存款= (第三年年初存教+ 1000)/(1+12* 0.0063)
第一年年初存款= (第二年年初存款+1000)/(1+ 12 * 0.0063)
通过以上过程前可以奔易地求出第一年年初要存入多少钱

#include<stdio.h>
int main()
{
	int i;
	float t = 0;
	for(i = 0; i < 5; i++)
	{
		t = (t+1000)/(1+0.0063*12);
	}
	printf("The answer:%.2f\n",t);

	return 0;
}

5.假设银行整存整取存教不同期限的月息利率分别为:
  0.63%  期限=1年
0.66%  期限= 2年
0.69%  期限≈3年
0.75%  期限= 5年
0.84%  期限= 8年
   利息=本金X月息利率X12X存款年限。
   现在某人手中有2000元,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。
   为了得到最多的利息,存入银行的钱应在到期时马上就取出来,然后立刻将原来的本金和利息加起来再作为新的本金存入银行.这样本利不断地滚动直到满20年为止。由于存款的利率不同,所以不同的存教方法(年限)存20年得到的利息也是不一样的。
  分析题意,设2000元存20年,其中1年存i1状,2年存i2次,3年存i3饮.5年存i5次,8年存i8次,根据题意还可得到以下限制条件:
  0<= i8<= 2
  0<= i5 <= (20-8* i8)/5
  0<= i3 <= (20-8*i8-5¥i5)/3
  0<= i2<= (20-8*i8-5*i5-3*i3)/2
  0<= il = 20-8*i8-5*15-3*i3-2*i2
  可以采用穷举法穷举所有的i8、i5、i3,i2和i1的组合,代入求本利的公式计算出最大值,就是最佳存款方案。

#include<stdio.h>
#include<math.h>

int main()
{
	int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;
	float max = 0,term;
	for(i8 = 0; i8 < 3; i8++)
	{
		for(i5 =0; i5 <= (20-8*i8)/5; i5++)
		{
			for(i3 = 0; i3 <= (20-8*i8-5*i5)/3;i3++)
			{
				for(i2 = 0; i2 <= (20-8*i8-5*i5-3*i3)/2; i2++)
				{
					i1 = 20-8*i8-5*i5-3*i3-2*i2;
					term = 2000.0*pow((double)(1+0.0063*12),(double)i1)*pow((double)(1+2*0.0066*12),(double)i2)*pow((double)(1+3*0.0069*12),(double)i3)*pow((double)(1+5*0.0075*12),(double)i5)*pow((double)(1+8*0.0084*12),(double)i8);
					if(term > max)
					{
						max = term;
						n1 = i1;
						n2 = i2;
						n3 = i3;
						n5 = i5;
						n8 = i8;
					}
				}
			}
		}
	}
	printf("%d %d %d %d %d %.1f\n",n8,n5,n3,n2,n1,max);
}

6.  A、B、C、D、E五人在某天夜里合伙去捕鱼,到第二天凌展时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按同样的方法拿鱼。问他们合伙至少捕了多少条鱼?
  根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条后剩下的鱼正好分为五份,然后拿走自己的一-份余下其它四份。
  假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4X(X-1)+5。若X满足上述要求,则X就是题目的解。

#include<stdio.h>
int main()
{
	int n,i,x,flag = 1;
	for(n = 6; flag; n++)
	{
		for(x = n, i = 1 && flag; i <= 5; i++)
			if((x-1)%5 == 0)
				x = 4*(x-1)/5;
			else flag = 0;
			if(flag)
				break;
			else flag = 1;
	}
	printf("%d\n",n);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值