上机题2020_5_29(水仙花数,猴子偷桃等)

1、输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。

这个问题我之前博客写过,我们最普通的就是用ASCII码作为判断依据,输入一个字符看它在哪个范围内,然后就累计加一,可以翻看我之前的博客,但显然出题人是想让我们用c附录后面的库函数<ctype.h>,具体操作如下

void Total(char ar[])
{
	int alpha = 0, digit = 0, space = 0, others = 0;
	for (int i = 0; ar[i] != '\0'; ++i)
	{
		if (isalpha(ar[i]))
		{
			alpha++;
		}
		else if (isdigit(ar[i]))
		{
			digit++;
		}
		else if(isspace(ar[i]))
		//else if (ar[i]==' ')     这里也可以这样写,但有的编译器可能不识别,所以不建议;
		{
			space++;
		}
		else
		{
			others++;
		}
	}
	printf("字母有%d个\n数字有%d个\n空格有%d个\n其他字符有%d个\n", alpha, digit, space, others);
}
int main()
{
	char ar[100]={o};  //先初始化都为0;
	gets_s(ar);
	Total(ar);
	return 0;
}

2、求Sn=a+aa+aaa+···+aaa··a之值,其实a是一个数字,n表示a的位数,例如:2+22+222+2222+22222(此时n=5),n由键盘输入。

这种题一般不难,难的是我们的分析,看懂它是怎么算的,说实话,之前我做的时候,我一直用递归想返回它的值,但是他只能返回一个,要么是22222,要么是2222,不会是它们之和Sn,后面研究后发现,这几个数都是前一数乘以10再加2,当然第一个数前面就是0咯,然后我们就可以写出代码;

int main()
{
	int sum1=0,sum2=0;
	int n=0;
	scanf_s("%d",&n);
	for(int i=0;i<n;++i)
	{
		sum1=sum1*10+2;
		sum2+=sum1;
	}
	printf("%d",sum2);
	return 0;
}

但是这个函数分块不明显,所以我们最好是把函数分为一块一块的,话不多说,看码

int Get_num(int a,int n)
{
	int num=0;
	for(int i=0;i<=n;++i)
	{
		num=num*10+a;
	}
	return num;
}
int Get_sum(int a,int n)
{
	int sum=0;
	for(int i=0;i<n;++i)
	{
		sum+=Get_num(a,i);
	}
	return sum;
}
int main()
{
	int n=0,a=2;
	scanf_s("%d",&n);
	printf("%d",Get_sum(a,n));
	return 0;
}

3、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=1立方+5立方+3立方;(标题格式好难打-.-)

这个简单,求出每个数字然后一立方再求和就可以判断了;

//上题已经说了函数尽可以分开写,所以我们后面不管需不需要冗余,我们尽量分块描述;
void Flower1(int n)
{
	int x=n%10;
	int y=n/10%10;
	int z=n/100;
	if(n==pow(x,3)+pow(y,3)+pow(z,3))
	{
		printf("%d\n",n);
	}
}
void Flower2(int n)
{
	int x=0,tmp=0;
	int t=n;
	while(t!=0)
	{
		x=n%10;
		tmp+=pow(x,3);
		x/=10;
	}
	if(tmp==n)
	{
		printf("%d\n",n);
	}
}
		
int main()
{
	for(int i=100;i<1000;++i)
	{
		Flower1(i);//Flower2(i)
	}
	return 0;
}

4、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出6到1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1,2,3

这个题之前一看就很懵,经过老师点化后就好多了,比如我之前看打这个只想到一个循坏,果然还是太天真了,我们要在每个数的每一趟的循环里循环找它的因子,所以循坏就得俩个了,啧啧。

void PerfectNum()
{
	int ar[100] = { 0 };
	for (int i = 1; i < 1000; ++i)
	{
		int sum = 0;
		int k = 0;
		for (int j = 1; j < i; ++j)    //判断因子 (循环条件其实可以改为j<=i/2,减少运算量)
		{
			if (i % j == 0)
			{
				sum += j;
				ar[k++] = j;
			}
		}
		if (sum == i)
		{
			printf("%d its factors are 1", i);
			for (int i = 0; i < k-1; ++i)
			{
				printf(",%3d ", ar[i+1]);
			}
			printf("\n");
		}
	}
}
int main()
{
	void PerfectNum();
	return 0;
}	

5、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想在吃时,就只剩一个桃子了。求第一天共摘多少个桃子。

这个我们可以递归,也可以不递归,我们下面展示俩种方法;

int main()
{
	int peach=1;
	int day;
	for(dat=9;day>0;--day)
	{
		peach=(peach+1)*2;
	}
	printf("%d ",peach);
	return 0;
}
int Get_peach(int day)
{
	if(day==10)
	{
		return 1;
	}
	else
	{
		return (Get_peach(day+1)+1)*2;
	}
}
int main()
{
	int day=1;
	printf("%d ",Get_peach(1));   //求第一天的桃子
	return 0;
}

6、俩个兵乓球对进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编程找出3对赛手的名单。

void Match()
{
	for (char A = 'Y'; A <= 'Z'; ++A)
	{
		for (char B = 'X'; B <= 'Z'; ++B)
		{
			char C = 'Y';
			if (A != B && A != C && B != C)
			{
				printf("A->%c\n", A);
				printf("B->%c\n", B);
				printf("C->%c", C);
			}
		}
	}
}
int main()
{
	Match();
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值