C 数据结构之%运算符的应用:数位拆解和进制转换

%运算:r=a%b,即a=k*b+r。其中k为某整数,r的绝对值范围为[0,b-1],其符号与a保持一致,除非其为0.

(a*b)%c=(a%c*b%c)%c     (a+b)%c=(a%c+b%c)%c

数位拆解是把一个给定数字各个数位上的数字拆开。

特殊乘法:对2个小于1000000000的输入,求结果。123*45=1*4+1*5+2*4+2*5+3*4+3*5 

样例输入:123 45 样例输出:54

思路:只需对x做整数除,使x除以10,即可将十位上的数字移动到个位,百威到十位,其他依次类推。重复求个位数字的方法,即得到移动到个位上的十位数字。不断的重复对x除以10,对10求模,即可得到数字x各个数位上的数字。

#include<stdio.h>
int main()
{
	int a,b;
	while (scanf("%d%d",&a,&b)!=EOF)
	{
		int buf1[20],buf2[20],size1=0,size2=0;//分别保存从两个数字中拆解出来的数位数字,其数量由size1.size2表示
		while (a!=0)//数位拆解,只要a依然大于0就不断重复拆解过程
		{
			buf1[size1++]=a%10;//取得当前个位上的数字,将其保存
			a/=10;//将所有数位上的数字移动到高一位上
		}
		while (b!=0)//拆解第二个数字
		{
			buf2[size2++]=b%10;
			b/=10;
		}
		int ans=0;//计算答案
		for(int i=0;i<size1;i++)
			for(int j=0;j<size2;j++)
		    	ans+=buf1[i]*buf2[j];
		printf("%d\n",ans);
		
	}
	return 0;
}

上面完成数位拆解使用数学方法,也可绕过数学原理,转而采用,把输入数据当字符串的技巧,直接将两个数字以字符串的形式保存起来,再依此遍历这个字符串,通过字符串与字符'0'的ascii值得差来计算字符所表示的数值,从而完成数位拆解。

#include<stdio.h>
int main()
{
	char a[11],b[11];
	while (scanf("%s%s",a,b)!=EOF)
	{
		int ans=0;
		for(int i=0;a[i]!=0;i++)
		  for(int j=0;b[j]!=0;j++)
		  ans+=(a[i]-'0')*(b[j]-'0');
		  printf("%d\n",ans);
	}
	return 0;
}
进制转换:输入不超过整形定义的非负10进制整数A和B,输出A+B的 m 进制数 。

输入:每个测试用例占一行,给出m和A B的值,输出A+B的m进制数.

样例输入:

8 1300 48

2 1 7

0

输出:2504 1000

思路:m进制转换成n进制:1.从m进制转换成10进制。2.从10 进制转换成n进制。当要求十进制数x的k进制表示时,我们只需对x不断重复的求余求商,即可由低到高依次得到各个数位上的数。反过来,要求得有k进制数表示的十进制数,我们需要依次计算各个数位上数字与该位权重的积,并累加。

#include<stdio.h>
int main()
{
	long long a,b;//使用数据类型long long确保不会溢出 
	int m;
	while(scanf("%d",&m)!=EOF)
	{
		if(m==0) break;//当m等于0时退出 
	   scanf("%lld%lld",&a,&b);//用%lld对long long变量赋值 
	   a=a+b;
	   int ans[50],size=0;//用ans来保存依次转换得到的各个数位数字的值,size表示其个数 
       do//依次求得各个数位上的数字 
       {
       	ans[size++]=a%m;
       	a/=m;
       }while(a!=0);//当a不等于0的时候重复对m求余,除以m的过程 
       for(int i=size-1;i>=0;i--)//从高位到低位输出 
       printf("%d",ans[i]);
       printf("\n");
	}
	return 0;
}
数值转换://求任意两个不同进制非负整数的转换,所给整数在long范围 ,不同进制表示符为0~9,a~f或者0-9,A-F

//输入 a ,n,b。n是a进制数转换为b进制数。输出字符均为大写

样例输入:15 Aab3 7

样例输出 210306

#include<stdio.h>
#include<string.h>
int main()
{
	int a,b;
	char str[40];
	while(scanf("%d%s%d",&a,str,&b)!=EOF)
	{//tmp为将要计算的a进制对应的十进制数,lenth为字符串长度方便我们从低高位遍历每个数位上的数
	//c为各个数位的权重初始化为1,表示最低位权值为1,之后每一位权重是前一位的a倍 
		int tmp,lenth=strlen(str),c=1;
		for(int i=lenth-1;i>=0;i--)//从低微到高位遍历每个数位上的数字 
		{
			int x;
			if (str[i]>'0'&&str[i]<'9')
			   {//当字符在0到9之间,计算其代表的数字 
			   x=str[i]-'0';}
			   else if(str[i]>='a'&&str[i]<='z')
			       {//当字符为小写字母时计算其代表的数字 
			        x=str[i]-'a'+10;}
			       else //当字母为大写 时,计算其代表的数字 
			          x=str[i]-'A'+10;
			tmp+=x*c;//累加该位数字与该位权重的积 
			c*=a;//计算下一位数位权重 
		}
		char ans[40],size=0;//用ans保存转换到b进制的各个数位数字 
		do
		  {
		  	int x=tmp%b;//计算该数位 
		  	ans[size++]=(x<10 )? x+'0':x-10+'A';//将该数位转换为字符 
		  	tmp/=b;
		  }while(tmp);
		  for(int i=size-1;i>=0;i--)
		  {
		  	printf("%c",ans[i]);
		  }
		  printf("\n");
	} 
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/joanna_or_zhouzhou/article/details/80353612