C经典题(工作室4)

1、输入某年某月某日,判断这一天是这一年的第几天

#include<stdio.h>
void main()
{
         int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},year,month,day,sum=0,i;
         //数组下标和月份一一对应,内容为对应月份的天数
        scanf("%d-%d-%d",&year,&month,&day);
        if(year%400==0||year%4==0&&year%100!=0)
            a[0]=day,a[2]=29;
        else a[0]=day;      
   //将day存放到a[0]的位置,方便后续统计,如果是闰年,需要将2月份改为29天
        for(i=0;i<month;i++)
            sum+=a[i];
   //因为a[0]存放的是day,所以就可以直接从a[0]遍历相加
        printf("%d ",sum);
}

2、将一个正整数分解质因数。例:输入90打印出90=2* 3 *3 *5

#include <stdio.h>
int main(){
	int n,i;   
	printf("输入一个整数:");
	scanf("%d",&n);
	printf("%d=",n);
	for(i=2; i<=n; i++){
		while(n!=i){
			if(n%i==0){
				printf("%d*",i);
				n=n/i;
			}else
				break;
		}
	}
	printf("%d\b\n",n);

	return 0;
}

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

#include<stdio.h>
void main()
{
	char ch;
	int letters=0,digit=0,space=0,others=0;
	while((ch=getchar())!='\n')
	{
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			letters+=1;
		else if(ch==' ')
			space+=1;
		else if(ch>='0'&&ch<='9')
			digit++;
		else 
			others++;
		

	}
	printf("letters=%d,digit=%d,space=%d,others=%d",letters,digit,space,others);
}

进阶题
一维数组的动态和
解释:给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请输出 nums 的动态和。

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4]

#include<stdio.h>
void main()
{
	int a[4],i;
	for(i=0;i<4;++i)
		scanf("%d",&a[i]);
	for(i=1;i<4;++i)
		a[i]+=a[i-1];
	for(i=0;i<4;++i)
		printf("%2d",a[i]);
}

字符串轮转
解释:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
先输出未移动的字符,再输出n—0的字符或将前n位字符存在另一个数组中,原数组中字符前移n后输出

#include<stdio.h>
void main()
{
	int i,j,h,n;
	char a[4],b[10];
	for(i=0;i<4;++i)
		scanf("%c",&a[i]);
	printf("输入左轮数:");
		scanf("%d",&n);
	for(i=0;i<n;i++)
		b[i]=a[i];
	for(i=n;i<4;++i)
		a[i]=a[i-n];
	for(i=0;i<n;++i);
	a[i+n]=b[i];
	for(i=0;i<4;++i)
		printf("%c",a[i]);
}

或者

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>

int main(){
	char s[] = "abcdefg";
	int n = 2;

	int len = strlen(s), i = 0;//计算长度
	char *ans = (char*)malloc(sizeof(char)* (len + 1));//创建新空间
	while (i < len){
		*(ans++) = s[(n + i) % len];//用到循环求余的操作
		i++;
	}
	*ans = '\0';//字符串结尾需要反斜杠零
	printf("%s", ans - len);
	

	system("pause");
	return 0;
}

字符串压缩
解释:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)
输入:“aabcccccaaa”
输出:“a2b1c5”
思路:先往新数组中填入一个字母,然后循环并记录个数直到当前字母不等于前一个字母,则填入数字并清0重新计算接着填入当前字母,最后在循环外填入最后一次的数字

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(){
	char S[] = "aabcccccaaa";
	int size = strlen(S);//计算字符串的长度
	if (size <= 2) {
		printf("%s", S);
		system("pause");
		return 0;}
	//特殊情况,特殊处理
	char* str = (char*)malloc(sizeof(char)* (2 * size));//创新建空间,两倍的防止每个字母只有一个的情况
	//创建空间这个是指针的知识 ,你们不会的话,可以用一个大数组来代替
	str[0] = S[0];
	int count = 1, index = 1;//count 是计相同字母的数量
	for (int i = 1; i < size + 1; i++) {
		if (S[i] == S[i - 1]) {
			count++;}
		else {
			int num = log10((float)count) + index;//防止字母数字超过10,需要两个字符
			index = num;//
			while (count) {//每十位做一次处理
				str[num--] = count % 10 + '0';
				count /= 10;	}
			str[++index] = S[i];//加上下一个字母
			count = 1;
			++index;
		}
	}
	if (index >= size + 1){
		printf("%s", S);
	}
	else{
		printf("%s", str);
	}
	system("pause");
	return 0;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值