C语言与练习题

进制转换

题目描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
示例1:
输入:
0xA
输出:
10

代码

//十六进制转十进制
#include<stdio.h>
#include<string.h>
#include<math.h> 

//函数声明
int value(char ch,int sign); 

int main()
{
    char str[10];
    int num=0,sign=0;
    while(gets(str)){
    	num=0,sign=0;
	    for(int i=strlen(str)-1;i>1;i--){
	    	num=num+value(str[i],sign);
	   		sign++;
		}
		printf("%d\n",num);
	}
	return 0;
} 

//输入:一个字符 和他在字符串中的进位数
//返回值:这个字符在这个位置上能表示的大小 
int value(char ch,int sign)
{
	int number;
	int ascii=(int)ch;
	if(48<=ascii&&ascii<=57){
		number=(ascii-48)*pow(16,sign);		
	}
	else{
		number=(ascii-55)*pow(16,sign);	
	}
	return number;
}

注:
这个多组同时输入当时不明白是啥意思,查了查才知道。
用了:while(gets(str)){}
只要从缓冲区(有的输入函数没有缓冲区,这样的不会回显,有他自己的用处)读取到一行数据,函数gets();是会有返回值(返回字符串首地址,char*类型)的。对于bool类型来说就是:1,也就让while循环运转起来了。实现了多组输入。
看样子上一次明明随机数去重,排列那一道题也应该是这样的,失策失策。

质数因子

题目描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )
最后一个数后面也要有空格

输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

示例1:
输入:
180
输出:
2 2 3 3 5

代码

//输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )
//后一个数后面也要有空格
#include<stdio.h>

//共同维护一个足够大的质因子数组,储存质因子,避免重复计算
long arr[10000]={2,3,5,7,11,13,17,19};

//声明
int Is_prime(long number);
long get_value(long number);

int main()
{
	long number;
	long flag;
	scanf("%d",&number);
	loop:
	if(Is_prime(number)){
		printf("%d ",number);
	}
	else{
		flag=get_value(number);
		printf("%d ",flag);
		number=number/flag;
		goto loop;
	}	
	return 0;
}

//输入一个long类型的数
//输出他的一个小于他开根号的一个质因子 
long get_value(long number) 
{
	//先尝试在已经维护的数组中找寻质因子 
	int sign=0; 
	for(;sign<10000;sign++){
		if(arr[sign]!=0){
			if(number%arr[sign]==0){
				return arr[sign];
			}
		}
		else{
			break;
		}
	}
	//在数组中不能找到这样一个质因子
	//继续维护这个质因子数组
	//当前sign数组下标指向的是一个为0的空位置 
	long prime=arr[sign-1]+2;//因为接下来的素数只能是加2中寻找
	for(;prime<number/2;prime=prime+2){
		//如果prime是一个素数 
		if(Is_prime(prime)){
			arr[sign]=prime;
			sign++;
			if(number%prime==0){
				return prime;
			}
		}
	}	
}

//输入一个long类型的数
//返回一个布尔值
//如果是1:表示是素数,如果是0表示不是素数 
int Is_prime(long number)
{
	for(int i=2;i<number/2;i++){
		if(number%i==0){
			return 0;
		}
	}
	return 1;
}

取近似值

题目描述
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
示例1:
输入:
5.5
输出:
6

代码

#include<stdio.h>

int main()
{
    float in;
    int out;
    scanf("%f",&in);
    out=in;//out本来是一个整形,in是float,默认向下取整
    if((in-out)>=0.5){
        printf("%d",out+1);
    }
    else{
        printf("%d",out);
    }
}

合并表记录

题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1:
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4

代码

#include<stdio.h>

int main()
{
    int arr[10000]={0};
    int key,value;
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&key);
        scanf("%d",&value);
        arr[key]=arr[key]+value;
    }
    for(int i=0;i<10000;i++){
        if(arr[i]!=0){
            printf("%d %d\n",i,arr[i]);
        }
    }
    return 0;
}

提取不重复的整数

题目描述
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

输入描述:
输入一个int型整数
输出描述:
按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
示例1:
输入:
9876673
输出:
37689

代码

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

char out[20];//用来储存已经输出过的内容

//声明
int In(char ch);

int main()
{
    char str[20];
    gets(str);
    int sign=0;
    int k=0;
    for(int i=strlen(str)-1;i>=0;i--){
        if(sign){
            if(In(str[i])){
                printf("%c",str[i]);
                out[k]=str[i];
                k++;
            }
        }
        else{
            if(str[i]!=0){
                sign=1;
                printf("%c",str[i]);
                out[k]=str[i];
                k++;
            }
        }
    }
}

//输入一个字符
//目的:判断该字符是否在out字符数组中
//在out数组中返回0,不在返回1
int In(char ch)
{
    for(int i=0;i<strlen(out);i++){
        if(out[i]==ch){
            return 0;
        }
    }
    return 1;
}

字符个数统计

题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。

输入描述:
输入N个字符,字符在ACSII码范围内。
输出描述:
输出范围在(0~127)字符的个数。
示例1:
输入:
abc
输出:
3

代码

#include<stdio.h>

int main()
{
    int sign[128]={0};//用来标识数组下标对应的ASCII码的字符在不在,1表示存在了
    char str[1000];
    fflush(stdin);
    gets(str);
    int num=0;
    int flag;
    for(int i=0;i<strlen(str);i++){
        flag=(int)str[i];
        if(0<flag&&flag<127){
            if(!sign[flag]){
                sign[flag]=1;
                num++;
            }
        }
    }
    printf("%d",num);
    return 0;
}

数字颠倒

题目描述
描述:
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
示例1:
输入:
1516000
输出:
0006151

代码

#include<stdio.h>

int main()
{
    int inteager;
    scanf("%d",&inteager);
    while(inteager>=10){
        printf("%d",inteager%10);
        inteager=inteager/10;
    }
    printf("%d",inteager);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值