C的小程序记录(更新131006)

1.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。

#include "stdio.h"
#include "string.h"
void string_filter(char *s_in, int len, char *s_out);
int main()
{
	char s[100],out[100];
	int len;
	gets(s);
	len = strlen(s);

	printf("in: %s\n",s);
	string_filter(s,len,out);
	printf("out: %s\n",out);
}

void string_filter(char *s_in, int len, char *s_out)
{
	unsigned int i,n;
	unsigned int js;
	memset(s_out,0,len);
	s_out[0] = *s_in++;
	n = 1;
	while(*s_in)
	{
		for(i = 0; i < n; i++)
		{
			if(*s_in != s_out[i])
			{
				js++;
			}
		}
		if(js == n)
		{
			s_out[n] = *s_in;
			n++;
		}
		js = 0; 
		s_in++;

	}
	s_out[n] = 0;
}


 

2.三天打鱼2天晒网

#include "stdio.h"

#define Uint32 unsigned int
#define Uint8 unsigned char

#define WORK_FINSH 0
#define WORK_NET 1

Uint8 month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int get_current_work(Uint32 y, Uint32 m, Uint32 d);

void main()
{
	Uint32 y =0,m =0,d =0;
	Uint8 temp;
	scanf("%d%d%d",&y,&m,&d);
	printf("y= %d,m= %d, d= %d\n",y,m,d);
	 temp = get_current_work(y,m,d);

	if(temp == WORK_FINSH)
	{
		printf("今天在打鱼\n");
	}
	else
		printf("今天在织网\n");

	return;
}

int get_current_work(Uint32 y, Uint32 m, Uint32 d)
{
	Uint32 sum_day;
	Uint8 temp1,temp2;
	Uint32 flag_366 =0 ;
	Uint32 i;
	Uint8 work_state;

	for(i = 2000 ; i < y;i=i+4)
	{
		if((!(y%4) && (y%100)) || !(y%400))
		flag_366++;
	}
	sum_day = (y-2000)*365 +flag_366;
	if((!(y%4) && (y%100)) || !(y%400))
	{
		month[2] = 29;

	}
	sum_day = sum_day % 5;

	for(i = 1; i < m;i++)
	{
		sum_day += month[i];
	}
	sum_day += d;
	sum_day = sum_day%5;
	if( sum_day>0 && sum_day <4)
		work_state = WORK_FINSH;
	else 
		work_state = WORK_NET;
	return work_state;

}


 

 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
 
#include <stdio.h>
#include <string.h>

void stringZip(const char *pIn, long len, char *pOut);

int main()
{
	char in_s[100];
	char out_s[100];
	gets(in_s);
	printf("%s\n",in_s);
	stringZip(in_s, strlen(in_s), out_s);
	printf("%s\n",out_s);
	return 0;

}

void stringZip(const char *pIn, long len, char *pOut)
{
	int i;
	int js = 0;
	int n = 0;
	char temp;
	for(i = 0; i < len; )
	{
		temp = pIn[i];
		while(temp == pIn[i])
		{
			js++;
			i++;
		}
		if(js !=1)
		{
			pOut[n] = js+0x30;
			pOut[n+1] = temp;
			n += 2;
		}
		else
			pOut[n++] = temp;

		js = 0;
	}
	pOut[n] = '\0';


}
 
 

整数化为2进制数,32位长度。然后逆序输出

#include <stdio.h>
#include <string.h>

int main()
{
 int m;
 int i = 0;

 char bin_32[33];
 memset(bin_32,0x30,32);
 scanf_s("%d",&m);

 while(m/2 != 0)
 {
  bin_32[31-i] = m % 2 + 0x30;
  m /= 2;
  i++;
 }
 bin_32[31-i] = m%2 + 0x30;
 bin_32[32] = 0;
 printf("%s\n",bin_32);

}

输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,比如输入-175,输出-571
 

#include <stdio.h>


void int_convert_char(int v,char *str);

int main(int argc,char *argv[])
{
 int value;
 char str[100];

 scanf("%d",&value);
 printf("输入%d\n",value);
 if(value < 0)
 {
  str[0] = '-';
  value = 0-value;
  int_convert_char(value,str+1);
 }
 else
 {
  int_convert_char(value,str);
 }

 printf("输出%s\n",str);


}


void int_convert_char(int v,char *str)
{
 int temp = 0;
 int i = 1;

 while(1){
  if(v%10 == 0) //delete last 0
  {
   v /= 10;
  }
  else
   break;
 }

 str[0] = 0x30 + v%10;
 v /= 10;

 do{

  temp = 0x30 + v%10;
  if(temp != str[i-1]){
   str[i] = temp;
   i++;
  }
  v = v/10;
 }while(v);
 str[i] ='\0'; // add string ending

}

 

 

输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果。

备注:1、两个整数都是正整数,被减数大于减数

示例:

输入:1000000000000001

      1

输出:1000000000000000

 

#include <stdio.h>
#include <string.h>

void sub_alg(char * max, int len0, char * min, int len1);

int main(int argc, char *argv[])
{
	char str_max[100];
	char str_min[100];
	int len0,len1;

	gets(str_max);
	gets(str_min);
	len0 = strlen(str_max);
	len1 = strlen(str_min);

	printf("输入:%s\n",str_max);	
	printf("%s\n",str_min);

	sub_alg(str_max, len0, str_min, len1);


	printf("输出:%s\n",str_max);

}

void sub_alg(char * max, int len0, char * min, int len1)
{
	int i = 1;
	int j ;
	int loop = len1;
	char *p = max;
	while(loop--)//每一位想减的次数
	{
		if(min[len1-i] > max[len0-i])//被减数小
		{
			j = i+1;
			max[len0-i] = max[len0-i] + 10 - min[len1-i] + 0x30;
			while(max[len0-j] == 0x30)
			{
				max[len0-j] = 0x30 + 9;
				j++;
			}
			max[len0-j] = max[len0-j] - 1 ;
		}
		else  //被减数大
		{
			max[len0-i] = max[len0-i] - min[len1-i] + 0x30;
	
		}
		i++;
	}

	while(1)//去除前面的0
	{
		if(*p == 0x30)
		{
			p++;
		}
		else
		{
			strcpy(max,p);
			break;
		}
	}
}


 

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值