C学习(2)

1.任意位超长数据加法运算

分析:超长数据,没有数据类型与其对应,无法通过scanf进行输入,只能存储于数组中。定义char型数组,输入后在转换为十进制数。

下列算法思想(右对齐):

              12345+123456:

          5 4 3 2 1 

   +     6 5 4 3 2 1 

—————————

          1 0 8 5 3 1


结果为  135801.

        代码为:

     

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

#define N 30

void shift(int a[], int n);

void main()
{
	int x[N] = {0} , y[N] = {0}, z[N+1] = {0}, i, carry = 0, flag;

	i = N -1 ;
	while( i>= 0 && isdigit( *(x+i)=getchar() ) )
		*(x+i--) -= '0';

	if(i>=0) 
		shift(x,i);

	i = N-1;
	while( i>=0 && isdigit( *(y+i) = getchar() ) )
		*(y+i--) -= '0';
	if ( i>=0 )
		shift(y,i);

	for (i=0; i<N; i++){
		*(z+i) = *(x+i) + *(y+i) + carry;
		carry = ( *(z+i) - *(z+i)%10 ) / 10;
		*(z+i)%=10;
		*(z+i)+='0';
	}

	*( z+N )=carry + '0';
	flag=0;

	for (i=N; i>=0; i--)
	{
		if ( flag==0 && *(z+i)!='0') flag = 1;
		if (flag == 1 ) putchar(*(z+i) );
	}
	puts("\n");
}

void shift(int a[], int n)
{
	int k, len, sft;

	len = N-1-n;
	sft = 1+n;
	for (k=0; k<len; k++)
		*(a+k) = *(a+k+sft);

	for (k=len;k<N;k++)
		*(a+k)=0;
}

 2.字符串排序。

要求:

   1,字母不区分大小写,按先后顺序打印。

    2,非字母原位打印


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

#define N 500


void main()
{
	char s[N], *p = s;

	int i, j, len;

	gets(p);
	len = strlen(p) ;

	for(i=0,j=0;i<26;i++)  // 排序
	{
		
		p = s;

		while ( *p && j < len )
		{
			if( isalpha(s[j])!=0 && tolower(*p) == 'a'+i )   //字母位,排序。
			{
				putchar( *p );
				j++;
			}
			else if ( !isalpha(s[j])  )  <span style="font-family: Arial, Helvetica, sans-serif;">//非字母位,原位打印</span>
			{
				putchar( s[j] );
				j++;
			}

			p++;
		}
		
	}
}

3.单个字符串第一次出现则打印。

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

#define N 128

void main()
{
	int num[N]={0};
	char s[N] = {""};
	char c;
	char *p = s;
	int i = 0;
	int j = 0;
	int len ;
	int flag = 0;

	gets(p);
	len = strlen (p);

	for(i=0; i<len; i++)
	{
		c = *(p+i);
		j = 0;
		while( *p )
		{
			if (c == *p++)
				j++;
		}
		if (j == 1)
		{
			putchar(c);
			flag = 1;
			break;
		}
		p = s;
	}
	if (!flag)
	{
		putchar('.');
	}
}

4.输入一个整数,反序输出其字符串。

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

#define N 128


void reverse(char *p);
void main()
{
	long a;
	char s[N], *p = s;

	scanf("%ld", &a);
	p = ltoa(a, p, 10);
	reverse(p);
	puts(p);
}

void reverse(char *p)
{
	int i,j,len;
	char tmp;
	
	len = strlen(p);

	for(i=0,j=len-1;i<j;i++,j--)
	{
		tmp = *(p+i);
		*(p+i) = *(p+j);
		*(p+j) = tmp;
	}
}

5.最小公倍数

#include <stdio.h>

int divisor(int m, int n);

void main()
{
	int multi;
	int m, n;


	scanf("%d%d", &m, &n);
	multi = m*n;
	printf("%d", multi/divisor(m, n));
}


int divisor(int m, int n)
{
	int tmp;
	
	if(m<n)
	{
		tmp = m;
		m = n;
		n = tmp;
	}

	tmp = m%n;
	if (tmp==0)
		return n;
	else
		return divisor(n, tmp);
}

5. 详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。
这里的下标意思是字符在字符串中的位置。
对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,
则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。
如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 
如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。
 
举例:输入str1为"dec",str2为"fab",合并为“decfab”,
分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”
样例输入:
dec fab
                   
样例输出:

5D37BF


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

#define N 1000
#define M 500
void strsort(char *p);
unsigned char  num(unsigned char  dat);

void main()
{
	char ss[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	char s1[N]={""};
	char s2[M]={""};



	char *p1 = s1;
	char *p2 = s2;

	scanf("%s",s1);
	scanf("%s",s2);



	strcat(s1, s2);

	strsort(s1);
	strsort(s1+1);

	while( *p1)
	{
		if (isdigit(*p1) )
		{
			*p1 = *p1 - '0';
			*p1 = num(*p1);
			*p1 = ss[*p1];
		}
		else if( isalpha(*p1) && toupper(*p1) <= 'F' && toupper(*p1) >= 'A' )
		{
			*p1 = toupper(*p1) - 'A'+10;
			*p1 = num(*p1);
			*p1 = ss[*p1];
		}
		p1++;
	}

	puts(s1);

}

void strsort(char *p)
{
	char tmp;
	int i = 0, j = 0;
	int  len;

	len = strlen(p) - 1;

	for (i=0;i <= len;i+=2)
	{
		for (j=i+2 ;j <= len; j+=2)
		{
			if ( *(p+j) < *(p+i) )
			{
				tmp = *(p+j);
				*(p+j) = *(p+i);
				*(p+i) = tmp;
			}
		}
	}
}


unsigned char  num(unsigned char  dat)
{
    unsigned char  val = dat;
	val = ((dat & 0x01) << 3) | ((dat & 0x02) << 1) | ((dat & 0x04) >> 1) | ((dat & 0x08) >> 3) ;
    return  val;
} 
6.链表倒数第k个节点
#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
	int data;
	struct Node *next;
}Node;

void main()
{
	int i=0,n;
	int k;

	Node *p, *q, *head;

	scanf("%d",&n);

	p = (Node *)malloc(sizeof(Node));
	if(!p) return;
	head = p;

	scanf("%d", &p->data);
	p->next = NULL;

	while(++i != n)
	{
		q = (Node *)malloc(sizeof(Node));
		if (!q) return;

		scanf("%d",&q->data);
		p->next = q;
		p = p->next;
	}

	p->next = NULL;
	
	scanf("%d",&k);

	if (k>=n || k<0)
		return ;
	
	p = head;
	q = head;
	i = 0;

	while(i++ != k+1)
	{
		q = q->next;
		i;
	}
	
	while(q)
	{
		p = p->next;
		q = q->next;
	}

	printf("%d", p->data);
	
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值