7-46 爬动的蠕虫 (15 分)
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11
#include <stdio.h>
int main()
{
int N,U,D,t=0,sum=0;
scanf("%d %d %d",&N,&U,&D);
while(1){
t++;//上爬1分钟
sum=sum+U;
if(sum>=N){
printf("%d\n",t);
break;
}
t++;//休息1分钟
sum=sum-D;
}
return 0;
}
7-47 二进制的前导的零 (10 分)
计算机内部用二进制来表达所有的值。一个十进制的数字,比如24,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。
现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。
输入格式:
一个整数,在32位的整数可以表达的范围内。
输出格式:
一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。
输入样例:
256
输出样例:
23
#include <stdio.h>
int main () {
int i, input;
long int temp=1;
scanf("%d",&input);
while (temp <= input){
i++;
temp *= 2;
}
if (input < 0 ) //负数情况下
printf("0");
else{
printf("%d",32 - i);
}
return 0 ;
}
7-48 求组合数 (15 分)
本题要求编写程序,根据公式Cnm =n!/m!(n−m)! 算出从n个不同元素中取出m个元素(m≤n)的组合数。
建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。
输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。
输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。
输入样例:
2 7
输出样例:
result = 21
#include <stdio.h>
int main()
{
double fact(int n);
int m,n;
scanf("%d %d",&m,&n);
double sum;
sum = fact(n)/(fact(m)*fact(n-m));
printf("result = %.0f",sum);//%。0f指定输出时不要小数部分
return 0;
}
double fact(int n){//求阶乘
double sam=1;//应为0!=1,1!=1,这里pro的初始值设为1,是为了处理传入0的情况
int i;
for(i=1;i<=n;i++){
sam = sam*i;
}
return sam;
}
7-49 Have Fun with Numbers (20 分)
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!
Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.
Sample Input:
1234567899
Sample Output:
Yes
2469135798
#include <stdio.h>
#include <string.h>
int main()
{
char c[25];//接收初始值
int num[25];//存取加倍后数据
int flag[10] = {0};//记录初始值每个数字出现次数
int flag2[10] = { 0 };//记录加倍后每个数字出现次数
int p = 0;//进位值
int count = 0, t, flag1 = 0;
gets(c);
for (int i = strlen(c) - 1; i >= 0; i--)
{
t = (c[i] - '0');
flag[t]++;//记录初始值每个数字出现次数
t = (t * 2 + p);
num[count++] = t % 10;
p = t / 10;
}
if (p)//还有进位
num[count++] = p;
for (int i = 0; i < count; i++)
flag2[num[i]]++;//记录加倍后每个数字出现次数
for (int i = 0; i < count; i++)
{
if (flag[num[i]] != flag2[num[i]])//数字出现次数不同
{
printf("No\n");
flag1 = 1;
break;
}
}
if (!flag1)
printf("Yes\n");
for (int i = count-1; i >= 0; i--)
printf("%d",num[i]);
return 0;
}
7-50 近似求PI (15 分)
本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。
输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:
scanf("%le", &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):
PI = 近似值
输入样例:
1E-5
输出样例:
PI = 3.14158
思路:只要最后一项小于给定精度 就跳出循环 保留五位小数输出即可
#include <stdio.h>
int main()
{
double eps,i,temp=1,sum=1;
scanf("%le", &eps);
for(i=1;temp>eps;i++){
temp = temp*i/(2*i+1);
sum = sum + temp;
}
printf("PI = %.5f\n",2*sum);
return 0;
}