常用数字处理

本文主要讨论C语言比较基础的数字处理

目录:1.判断数字有几位;2.顺序,逆序输出各位;3.字符串与数字转换
主要掌握思路,熟练代码

1.输入数字,判断有几位

#include<stdio.h>
int Count()
{
	    char a[20];//数字不超20否则越界
		int i;
		printf("输入一个数不多于20位");
		for(i=0;i<20;i++)
		{
			scanf("%c",&a[i]);//指针从首地址开始一位一位后移,记录输入值
		    if (a[i]=='\n')
			{break;}
		}
		printf("一共有%d位数",i);
}

2.读取数字每一位
(1)逆序 eg:123(一百二十三)—>3 2 1
思路:读取各位,再丢弃各位
(123取个位数字3,。123变为12,取个位数字2。12变1,取1)
取个位:取余 eg:123取3 : 123%10= =3
丢个位:除以10 eg:123丢掉3变12: 123/10= =12 (两个整型数据商也为整型,去 掉小数)

void ReversePrint(int n)
{
    if(n==0{
     printf("0\n";
     return;
    }
  while(n!=0)//丢个位最后只剩一位,除10商为0
  {
     printf("%d\n",n%10);//取个位
     n/=10;//ss丢个位
  }
  return 0;
}

(2)顺序 eg:123(一百二十三)—>1 2 3
思路:得最高位再丢最高位
123 : 123/100得1 123%100= =23 丢1 权数100
1234 :1234/1000得1 123%1000= =23 丢1 权数1000
位数不同除和余的权数不同

void Print(int n)
{
    int c=Count(n);//调用前面计算位数函数
    int power=pow(10.0,c-1);//权数
    do
    {
      printf("%d",n/power);
      n%=power;
    }while(n!=0);
}

3.数字与字符串转换
(1)数字与字符转换:5+‘0’=‘5’ ‘5’-‘0’=5
(2)数字转十进制字符串 123–>“123”
库函数:itoa()
自定义:`思路:取个位转为字符,丢个位(逆序),再字符串翻转(逆置)
逆置思路:两个指针一个从头向尾,一个从尾向头,交换

void StrReverse(char*str)//翻转字符串  “abc”-->"cba"
{
  char*p;
  for(p=str;*p!='\0';p++)
     ;   //什么都不执行,只是为了把指针p放到'\0',str为字符串首元素
     for(p--;str<p;str++,p--//第一个p--让指针从‘\0’到最后一个元素,str指针向后移,p指针向前移
     {
     int tmp=*str;
     *str=*p;
     *p=tmp;
     }
 }
 
int Myitoa(char *num,int n)//数字转字符串
{
	int i=0;//下标
	do
	{
	 num[i++]=n%10+'0';//取个位数并转换为字符
	 n/1=0;//丢个位
	}while(n!=0)
	num[i]='\0';//**字符串以'\0'结尾**  容易忘!!!!
	printf("%s\n",num);//num为字符串(逆序)
	StrReverse(num);//顺序
	return 0}

(3)字符串转十进制数字 (遇到非数字字符结束)
库函数 atoi()
自定义:思路:处理正负符号,处理数字前面空格,再字符串从左到右
“‘123”–>123(一百二十三)
取1,取12(110+2),取123(1210+3)

#include<stdio.h>
#include<ctype.h>
int Myatoi(char *str,int n) 
{
    const int max=2147483647;//整型最大
    const int min=-2147483648;//整型最小取值
   	int s=0;//保存字符串结果
	int flag=1;//符号,默认正
	while(*str==' ')//处理空格,可能不止一个
	{
	  str++;
	 }
	 if(*str=='+')
	 {
	 str++;
	 }
	 else if(*str=='-')
	 {
	 flag=-1;
	 str++;
	 }
	while(isdigit(*str))
	 {
	  s=s*10+(*str-'0');
	  str++;
	 }
	if(s>max/10&&flag==1||s<min/10&&flag==-1)
	  {
	  printf("数据溢出,重新输入");
	  return -1;
	  }
	 return s*flag;
	 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值