将正数删除重复位,保留低位

对于11222332244这种就变位1324

代码如下

#include<stdio.h>
#include<string.h>
int main()
{
	long long num=0;
	printf("请输入一个整数:");
	scanf("%lld", &num);
	char digits[400] = "\0";//假设输入的正整数不超过10位数
	int i = 0;
	do {
		digits[i++] = num % 10 + '0';
		num /= 10;
	} while (num > 0);
	digits[i] = '\0';//添加字符串结束符
	int j=0;
	char temp;
	for (i = 0, j = strlen(digits) - 1; i < j; i++, j--)
	{
		temp = digits[i];
		digits[i] = digits[j];
		digits[j] = temp;
	}
	//printf("%s",digits); 
	char uniqueDigits[10] = "\0";//存储去重后的数组,去重之后最多10个数 
	int seen[10] = { 0 };//存储已经出现过的数字,0的时候表示为没有出现 

	for (int i = strlen(digits); i > 0; i--)//现在通过这个for循环得下来一个倒叙的不重复
	{
		int digit = digits[i - 1] - '0';//得到相应的整型数字 
		if (!seen[digit])//这是在说出现 if(里面是1的话),就执行if里面的句子 
		{//也就是说没有出现的往下写 
			int len = strlen(uniqueDigits);//得下来此时去重后的数组长度 
			//
			//printf("%d\n",len); 
			//
			uniqueDigits[len] = digits[i - 1];//然后将这个没出现的存到去重数组后面,这就有一定问题 
			uniqueDigits[len + 1] = '\0';//更新字符串结束符位置 
			seen[digit] = 1;//将当前数字标记为已出现 
		}
	}

	for (i = 0, j = strlen(uniqueDigits) - 1; i < j; i++, j--)
	{
		temp = uniqueDigits[i];
		uniqueDigits[i] = uniqueDigits[j];
		uniqueDigits[j] = temp;
	}
	int value = 0;
	for (i = 0; i < strlen(uniqueDigits); i++)
	{
		value = value * 10 + (uniqueDigits[i] - '0');
	}
	printf("%d", value);
	return 0;
}

如果分开写

//这个是建立函数的, 
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
void reverse(char s[]);
void itoa(int num, char s[]);
void Char_exchange_int(char s[], int* value);
int main() 
{
	long long num;
	printf("请输入一个整数:");
	scanf("%lld", &num);
	char digits[400];//假设输入的正整数不超过10位数
	itoa(num, digits);
	//
	//printf("%s",digits);检验能够将整型转为字符串 
	//
	char uniqueDigits[10] = "\0";//存储去重后的数组,去重之后最多10个数 
	int seen[10] = { 0 };//存储已经出现过的数字,0的时候表示为没有出现 

	for (int i = strlen(digits); i>0; i--)//现在通过这个for循环得下来一个倒叙的不重复
	{
		int digit = digits[i-1]-'0';//得到相应的整型数字 
		if (!seen[digit])//这是在说出现 if(里面是1的话),就执行if里面的句子 
		{//也就是说没有出现的往下写 
			int len = strlen(uniqueDigits);//得下来此时去重后的数组长度 
			//
		    //printf("%d\n",len); 
			//
			uniqueDigits[len] = digits[i-1];//然后将这个没出现的存到去重数组后面,这就有一定问题 
			uniqueDigits[len + 1] = '\0';//更新字符串结束符位置 
			seen[digit] = 1;//将当前数字标记为已出现 
		}
	} 
	reverse(uniqueDigits);
	int value = 0;
	Char_exchange_int(uniqueDigits, &value);
	printf("去重后的数字为%lld", value);
	//reverse(uniqueDigits);
	//printf("去重后的数字为%s", uniqueDigits);
	return 0;
}

//前后相倒换 
void reverse(char s[]) {
	int i, j;
	char temp;
	for (i = 0, j = strlen(s) - 1; i < j; i++, j--) 
	{
		temp = s[i];
		s[i] = s[j];
		s[j] = temp;
	}
}  

//将int型数据转化为char 
void itoa(int num, char s[])
{
	int i = 0;
	do {
		s[i++] = num % 10 + '0';
		num /= 10;
	} while (num > 0);
	s[i] = '\0';//添加字符串结束符
	reverse(s);//反转字符串 
}

//char转化为int 
void Char_exchange_int(char s[],int *value)
{
	for (int i=0; i<strlen(s);i++)
	{
		(*value)=(*value)*10+(s[i]-'0');
	}
}

运行代码,都是可以的

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值