C语言(二十)

1、数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置。
输入:输入长度为n的整型数组a和右移位数m
输出:输出移动后的数组a的序列
优化目标:无

#include <stdio.h>
#define MAXN 10
void ArrayShift( int a[], int n, int m );
int main()
{
    int a[MAXN], n, m;
    int i;
    
    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
    ArrayShift(a, n, m);
    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");
    
    return 0;
}
int ArrayShift( int a[],int n, int m )
{
    int i,j,temp;
    for(i=0;i<m;i++)//一共移动m轮
    {
        temp=a[n-1];//记录最后一位数字
        for(j=n-2;j>=0;j--)//开始向后移
        {
            a[j+1]=a[j];
        }
        a[0]=temp;//将存储的最后一个数字放入开头位置
    }
}

2、拆分实数的整数与小数部分
本题要求实现一个拆分实数的整数与小数部分的简单函数。
输入:输入float型数x
输出:输出x的整数部分intpart与小数部分fracpart
优化目标:无

#include <stdio.h>

void splitfloat( float x, int *intpart, float *fracpart );

int main()
{
    float x, fracpart;
    int intpart;
    
    scanf("%f", &x);
    splitfloat(x, &intpart, &fracpart);
    printf("The integer part is %d\n", intpart);
    printf("The fractional part is %g\n", fracpart);
    
    return 0;
}
void splitfloat( float x, int *intpart, float *fracpart ){
	*intpart=(int)x;
	*fracpart=x-*intpart;
}

3、使用函数的选择法排序
本题要求实现一个用选择法对整数数组进行简单排序的函数。
输入:输入长度为n的整型数组a
输出:输出数组a的升序序列
优化目标:无

#include <stdio.h>
#define MAXN 10

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

int main()
{
    int i, n;
    int a[MAXN];
    
    scanf("%d", &n);
    for( i=0; i<n; i++ )
        scanf("%d", &a[i]);

    sort(a, n);

    printf("After sorted the array is:");
    for( i = 0; i < n; i++ )
        printf(" %d", a[i]);
    printf("\n");
        
    return 0;
}
void sort( int a[], int n ){
	int i,j,min;
	for(i=0;i<n-1;i++){
		min=i;
		for(j=i+1;j<n;j++){
			if(a[i]>a[j])
				min=j
		}
		if(min!=i){
			temp=a[i];
			a[i]=a[min];
			a[min]=temp
		}
	}
}

4、本题要求实现一个删除字符串中的指定字符的简单函数。
输入:输入字符串s以及待删除字符c
输出:输出修改后的字符串s
优化目标:减少时间复杂度

#include <stdio.h>
#include <string.h>
#define MAXN 20

void delchar( char *str, char c );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */

int main()
{
    char str[MAXN], c;

    scanf("%c\n", &c);
    ReadString(str);
    delchar(str, c);
    printf("%s\n", str);
    
    return 0;
}
void delchar(char *str, char c)
 {
 	int  i,j;
  	i=0;j=0;
 	while(str[i]!='\0')
	{
 		if(str[i]!=c)  //当不用删除时,相当于重新写str字符串,而有删除时,则使i略过这个到下一个,j直接接到下一个
    	{      
      		str[j]=str[i];
      		j++;
    	}
    	i++;   
  	}
  	str[j]='\0';//最后补上结尾
}

void delchar2( char *str, char c )//倒着删
{
	int i,j;
	int t=1;
	int n=strlen(str);
	for(i=MAXN-1;i>=0; i--)
	{
		if(str[i]==c)
		{
			for(j=i;j<MAXN-t;j++)  //因为后部分有被删除的字符,所以每删除一个字符,可以少移动一次
			    str[j]=str[j+1];
			t++;	//删除的字符数加一
		 }			
	}
}

5、判断回文数
输入:输入整型数num
输出:输出num是否回文数
优化目标:无
思路:逆序,如果和原数相同则为回文数。

#include <stdio.h>

bool huiwenshu(int num);
int main(){
    int num;
    scanf("input a interger:");
    scanf("%d",&num);
    if(huiwenshu(num)){
    	printf("%d 是回文数", num);
	}
	else{
		printf("%d 不是回文数", num);
	}
	return 0; 
}
bool huiwenshu(int num){
	int s,y=0;
	s=num;
	while(s>0){
		y=y*10+s%10;
		s/=10;
	}
	if(y==num)
		return true;
	else
		return false;
}

6、判断字符串是否为回文
输入:输入字符串str
输出:输出字符串str是否回文
优化目标:无

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

bool  huiwen(char *str, int len);
int main(){
    char str[20];
    scanf("input a string:");
	scanf("%s",&str);
	if(huiwen(str, strlen(str))){
		printf("是回文"); 
	}
	else{
		printf("不是回文");
	}
	return 0;
}
bool  huiwen(char *str, int len){
	int i;
	for(i=0;i<len;i++){
		if(str[i]!=str[len-i-1]){
			return false;
		}
	}
	return true;
}

7、长整数转化成16进制字符串
本题要求实现一个将长整数转化成16进制字符串的简单函数。
输入:输入长整数x
输出:输出x转化后的十六进制字符串s

#include <stdio.h>
#define MAXN 10

void f( long int x, char *p );

int main()
{
    long int x;
    char s[MAXN] = "";
    
    scanf("%ld", &x);
    f(x, s);
    printf("%s\n", s);
    
    return 0;
}
void f(long int x, char* p)
{
    char temp[MAXN];    // 临时字符数组
    int strLen=0;     // 字符串长度
    int index=0;      // 数组下标

    if (x<0)
    {
        p[0]='-';     // 负数符号
        index=1;      // 第0位存储符号
        x=-x;         // 将x处理为正数,方便进行模运算
    }
    else if (x==0)
    {
        *p='0';       // 为0,直接返回
        return;
    }

    while (x!= 0)
    {
        // 求余数
        int remainder=x % 16;

        // 余数大于0小于10,对应十六进制字符'0'~'9'
        if (remainder<10)
        {
            temp[strLen]=remainder+'0';
        }
        // 余数大于等于10且小于等于15,对应十六进制字符'A'~'F'
        else if (remainder>=10&&remainder<=15)
        {
            temp[strLen]=remainder-10+'A';
        }

        strLen++;
        x/= 16;
    }

    // 将临时字符数组temp[]中的元素逆序存放入p数组
    for (index;(strLen - 1)>= 0;index++,strLen--)
    {
        p[index]=temp[strLen-1];
    }
}



总结:今天练习了pta的题,回顾了排序算法。明天计划继续练题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值