西安交通大学 大学计算机2023(C语言)题解

答案仅供参考,每周更新,希望能够带来一些不同的启发与思路

有解释的部分直接写注释里,若有不懂欢迎评论留言,看到就会回的


Week 3

T1:

输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。

    输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。

    输出:0,1,2,3,4的统计个数,用一个空格隔开(最后一个输出后面没有空格)。

样例:

3 3 3 2 2 1 0 3 4 4 -1

1 1 2 4 2

#include<stdio.h>
int a[10],b[10],n;//a数组用来记录数字,其实可以用单个变量即可,b数组用来记录出现次数,大小理论到4就可以,习惯开大点 
int main()
{
	n=0;
	while(scanf("%d",&a[n]))
	{
		if(a[n]==-1)
		{
			break;
		}
		b[a[n]]++;
	}
	for(int i=0;i<=4;i++)
	{
		if(i!=4)
		{
			printf("%d ",b[i]);
		}
		else
		{
			printf("%d",b[i]);
		}
	}
	return 0;
 } 

T2:

将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。

如数字15,可以分解为:

15=1+2+3+4+5

15=4+5+6

15=7+8

#include<stdio.h>
int a,b;
int check(int n)//写个check函数看看能不能正好加起来是a,第一个int代表返回值,第二个int是输入值 
{
	int now=a;
	while(now>0)
	{
		now=now-n;
		n+=1;//n=n+1能看懂吧 
	}
	if(now==0)//刚好能加和 
	{
		return 1;//返回1代表可以 
	}
	else
	{
		return 0;//代表不行 
	}
}
int main()
{
	scanf("%d",&a);
	b=a/2+1;//由观察不难看出要想连续加和等于a,b一定小于a的一半,那么从1开始到a一半加一开始枚举(除2就是边界可以不加一,但我比较求稳这样写的时候比较无脑),这里的除法是向零取整,也就是向下取整 
	for(int i=1;i<=b;i++)
	{
		if(check(i)==1)//从i开始连续整数可以加和 
		{
			int now=a,d=i;//这里做一个数据转移记录,保持原始数据a和i不被修改,后面还要用,下面输出修改now与d就行了 
			printf("%d=",a);
			while(now>0)
			{
				now-=d;
				if(now!=0)
				{
					printf("%d+",d);//注意格式 
				}
				else
				{
					printf("%d",d);
				}
				d++;
			}
			printf("\n");
		}
	}
	return 0;
}

T3:

求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。
 

#include<stdio.h>
int a,n,now=0,ans=0;
int main()
{
	scanf("%d%d",&a,&n);
	for(int i=1;i<=n;i++)
	{
		now=now*10+a;//now用来记录当前加数 
		ans+=now;//ans记录总和 
		for(int j=1;j<=i;j++)//以下是把加式输出出来,注意格式 
		{
			printf("%d",a);
		}
		if(i!=n)
		{
			printf("+");
		}
		else
		{
			printf("=%d",ans);
		}
	}
	return 0;
}

T4:

“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
    输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
    输入:n,m,用空格隔开。
    输出:若干水仙花数,用空格隔开(最后一位输出后面无空格)。

#include<stdio.h>
#include<stdbool.h>
int n,m;
int check(int a)//判断函数,返回1是水仙数,2不是 
{
	int b,c=a,tot=0;//tot记录加到多少,c用来保存a 
	while(a>0)
	{
		b=a%10;
		a=a/10;
		tot+=b*b*b;
	}
	if(tot==c)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	bool first=0;//bool类型,需要头文件<stdbool.h> ,一方面对第一个输出数据前面没有空格做判断,另一方面做标志看区间内有没有水仙数 
	for(int i=n;i<=m;i++)
	{
		if(check(i)==1)
		{
			if(first==0)
			{
				printf("%d",i);
				first=1;//第一个水仙数输出完毕改first为1 
			}
			else
			{
				printf(" %d",i);
			}
		}
		
	}
	if(first==0)//如果没改过,那么就是没有水仙数 
	{
		printf("-1");
	}
	return 0;
}
 

T5:

求一组数中的最大值,然后统计该最大值在这组数中出现的次数。

  输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)

  输出:最大值及出现的次数。数据间以一个逗号隔开。

#include<stdio.h>
int a,b[201],now,n,now_max;//now用来代表当前最大值对应的出现次数,b数组开始均为0(开在主函数外初值均为0),用作统计,now_max用来记录当前最大值 
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a);
		if(a>now_max)//找到新的最大值 
		{
			now_max=a;//更新最大值 
			now++;//更新计数数组,重新开始计数 
			b[now]++;
		}
		else if(a==now_max)
		{
			b[now]++;//当前最大值又出现计数加一 
		}
	}
	printf("%d,%d",now_max,b[now]);
	return 0;
}

T6:

定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。

输入:5个单词

输出:最大和最小单词(按字典序)

如:

one two three four five
max:two min:five(注:max和min后是英文冒号)

#include<stdio.h>
#include<string.h>
char a[500][500];
void qsort(void)//用冒泡排序思想写一个字符串排序(由小到大 
{
	for(int i=1;i<=4;i++)//冒泡排序,可以去看看csdn具体解释,外层n-1次,内层1到n-i 
	{
		for(int j=1;j<=5-i;j++)
		{
			if(strcmp(a[j],a[j+1])>0)//strcmp比较字符串函数,前面大返回>0,后面大返回<0,相等=0 
			{
				char c[500];//交换 
				strcpy(c,a[j]);
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],c);
			}
		}
	}
}
int main()
{
	for(int i=1;i<=5;i++)
	{
		scanf("%s",&a[i]);
	}
	qsort();//排序 
	printf("max:%s min:%s",a[5],a[1]);//第一个最小 ,最后一个最大 
	return 0;
}

T7:

将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.

样例:

***street*****music***

street*****music******

#include<stdio.h>
#include<string.h>
char a[1000];
int main()
{
	scanf("%s",&a);
	int tot=0;
	for(int i=0;i<strlen(a);i++)
	{
		if(a[i]=='*')
		{
			tot++;//tot记录一下前面有几个* 
		}
		else
		{
			break;//一旦不连续就终止 
		}
	}
	for(int i=tot;i<strlen(a);i++)
	{
		printf("%c",a[i]);
	}
	for(int i=1;i<=tot;i++)
	{
		printf("*");
	}
	return 0;
}

T8:

从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。

如:

18

1*2*3*3

线性筛素数可以看看这里 传送门

#include<stdio.h>
#include<string.h>
int a,b,tot;
int p[500000],ip[500000];//数据不大开500000就够用 
void zhishu(void)//这里用到一点线性筛素数算法,可以看看链接,p数组代表质数表,ip是判断数组,判断该数是否为质数 
{
	tot=1;
	ip[0]=0;
	ip[1]=0;
	for(int i=2;i<=500000;i++)
	{
		if(ip[i]) p[tot++]=i;
		for(int j=1;j<=tot&&i*p[j]<=500000;j++)
		{
			ip[i*p[j]]=0;
			if(i%p[j]==0) break;
		}
	}
}
int main()
{
	scanf("%d",&a);
	memset(ip,1,sizeof(ip));//初始化为1,在<string.h>库里 
	zhishu();
	printf("1");
	if(ip[a])//是质数 
	{
		printf("*%d",a);
	}
	else
	{
		for(int i=1;i<=tot;i++)
		{
			while(a%p[i]==0)//把所有质因子写出来 
			{
				a=a/p[i];
				printf("*%d",p[i]);
			}
			if(p[i]>a/2+1)//大于一半就不是质因子了,提高运算效率 
			{
				break;
			}
		}
	}
	
	return 0;
 } 

T9:

有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)

#include<stdio.h>
int n;
int main()
{
	double fenzi=2.0,fenmu=1.0,ans=0.0,c;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		ans+=fenzi/fenmu;
		c=fenmu;
		fenmu=fenzi;
		fenzi=c+fenzi;
	}
	printf("%0.4lf",ans);
	return 0;
 } 

T10:

输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数

#include<stdio.h>
int n,year,month;
int main()
{
	scanf("%d,%d",&year,&month);
	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
	{
		printf("31");
	}
	else if(month==4||month==6||month==9||month==11)
	{
		printf("30");
	}
	else if(month==2&&((year%100!=0&&year%4==0)||(year%100==0&&year%400==0)))
	{
		printf("29");
	}
	else printf("28");
	return 0;
 } 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值